IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Sélectionner plusieurs lignes au hasard suivant plusieurs catégorie


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 71
    Points : 91
    Points
    91
    Par défaut Sélectionner plusieurs lignes au hasard suivant plusieurs catégorie
    Bonjour,

    J'ai le jeu de données suivant :
    Pièce Famille Sous-famille
    1 5 6
    2 5 7
    3 5 7
    4 2 3

    Je souhaiterais extraire les données de cette table de façon aléatoire. Il faudrait dans l'extraction une pièce prise au hasard par couple famille/sous-famille.

    Pour ce jeu de donnée par exemple l'extraction serait :
    Pièce Famille Sous-famille
    1 5 6
    3 5 7
    4 2 3

    Je ne sais pas trop comment attaquer la requête pour avoir le résultat escompté... Si quelqu'un a des indices je suis preneur.

    Merci par avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La seule solution que je connaissance consiste à trier les lignes suivant un ordre aléatoire et de prendre la première.

    Dans votre cas, quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH CTE AS (
    CTE AS (
    	SELECT *, ROW_NUMBER() OVER(PARTITION BY Famille, SousFamille ORDER BY NEWID() ) AS RN
    	FROM LaTable
    )
    SELECT piece, Famille, SousFamille
    FROM CTE
    WHERE RN = 1
    L'inconvénient, est que cela opére un tri, couteux...

    S'il s'agit d'une grosse table, vous pouvez utiliser la clause TABLESAMPLE pour réduire en amont le jeu de données à trier, mais attention à bien l'utiliser en fonction de votre cas, sinon vous pourriez ne pas avoir certains couples Famille, SousFamille dans la résultat

  3. #3
    Membre régulier
    Homme Profil pro
    France
    Inscrit en
    Juillet 2016
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : France
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 71
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    C'est tout à fait ça !

    Je vous remercie pour la solution rapide.

    Au niveau des enregistrements la table n'a que quelques lignes... Donc pas de problème

    Cordialement,

  4. #4
    Membre expérimenté

    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Novembre 2014
    Messages
    815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 815
    Points : 1 350
    Points
    1 350
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE @data TABLE 
    (
    Family INT,
    Room INT,
    subfamily INT
    );
    INSERT @data VALUES (1,5,6),(2,5,7),(3,5,7),(4,2,3),(4,2,4);
     
    -- Number of Rows 
    DECLARE @rows INT = 3;
     
    SELECT TOP (@rows) y.Family, y.Room, y.subfamily
    FROM @data AS y
    ORDER BY NEWID();

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par abdallah_mehdoini Voir le message
    ORDER BY NEWID();
    Merci de ta participation mais tu ne fais que redire ce qui a été dit 2 commentaires plus haut...

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 101
    Points : 187
    Points
    187
    Par défaut
    Autre façon de faire sur des grandes tables. (doc Microsoft)

    https://docs.microsoft.com/en-us/pre...ectedfrom=MSDN

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Et sur les TRES TRES grandes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM MaTable TABLESAMPLE (1 PERCENT)
    TABLESAMPLE est un opérateur de la norme SQL.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment sélectionner plusieurs lignes dans R ?
    Par francoise_peace dans le forum R
    Réponses: 1
    Dernier message: 25/08/2011, 10h51
  2. Sélectionner plusieurs lignes dans un StringGrid?
    Par cmali67 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/06/2011, 10h34
  3. Réponses: 11
    Dernier message: 30/08/2008, 10h06
  4. E07 Sélectionner plusieurs lignes conditions
    Par eillon dans le forum Excel
    Réponses: 5
    Dernier message: 11/03/2008, 18h46
  5. Réponses: 7
    Dernier message: 17/05/2006, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo