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

Langage SQL Discussion :

[SQL Server 2000] sélectionner les n premières lignes d'un groupe


Sujet :

Langage SQL

  1. #1
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut [SQL Server 2000] sélectionner les n premières lignes d'un groupe
    Bonjour,

    Malgré une recherche intensive dans les différents forums, je ne parviens pas à trouver de solution à mon problème.
    Je suis sous SQL Server 2000.
    J'ai une table avec un clef concaténée sur 2 colonnes, que nous appellerons col1 et col2.
    Je cherche à sélectionner les 2 premiers enregistrements (col1, col2) de chaque valeur de col1 selon un ordre croissant sur une troisième colonne col3.

    J'ai bien pensé au IN, mais comme ma clef est concaténée, SQLServer 2000 ne permet pas des synthaxes du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... where (col1, col2) in (select col1, col2 from...)
    Et j'ai beau chercher, je coince...

    Une idée ?

    ced

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 401
    Points
    28 401
    Par défaut
    Essaye plutôt avec EXISTS...

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Merci de l'aide.
    Le seul problème avec EXISTS, c'est que c'est du tout ou rien, pas comme IN. Et dans mon cas, la condition est bien vérifiée et je ne peux donc pas filtrer les 2 premières lignes...

    Je poursuis mes recherches...

    ced

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 401
    Points
    28 401
    Par défaut
    Citation Envoyé par ced
    Le seul problème avec EXISTS, c'est que c'est du tout ou rien, pas comme IN.

    Ces deux requêtes donnent des résultats équivalents, la seconde ayant l'avantage d'être prise en charge par tous les SGBD (qui acceptent des sous-requêtes ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT  *
    FROM    table1  AS t1
    WHERE   (t1.col1, t1.col2)  IN
            (   SELECT  t2.col3
                    ,   t2.col4
                FROM    table2 AS t2
            )
    ; 
    SELECT  *
    FROM    table1  AS t1
    WHERE   EXISTS
            (   SELECT  1
                FROM    table2 AS t2
                WHERE   t2.col3 = t1.col1
                    AND t2.col4 = t1.col2
            )
    ;

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Ca coince toujours...
    La seconde requête, qui est celle que j'avais exécutée puisque SQLServer 2000 ne permet pas la synthaxe de la première, me renvoit toutes les lignes de ma table1.
    Et pour cause, dans mon cas, je fais une auto-jointure sur table1.
    Donc, EXISTS renvoit systématiquement TRUE sur toutes les valeurs de col1, et le premier SELECT renvoit donc toutes les lignes de la table1.
    Dans mon cas, il faut juste que j'obtienne les 2 premiers de chaque occurence de col1.
    Avec le IN, pas de problème (j'ai testé sous MySQL et ça marche avec un LIMIT)... Mais je dois exécuter la requête sous SQLServer...

    Dur, dur, pour une petite requête...

    ced

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 536
    Points
    31 536
    Billets dans le blog
    16
    Par défaut
    Bonjour ced,

    Votre exposé est un peu flou. Ceci dit, est-ce que cette requête va dans le sens de ce que vous attendez ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select *
    from   T as x
    where  (select count(*)
            from   T as y
            where  x.col1 = y.col1
            and    x.col2 > y.col2) < 2
    order by col1, col3 ;

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Respect
    Une solution aussi simple...
    Y'a pas, faut encore que je travaille...

    Merci beaucoup,

    ced

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 100
    Points : 31 536
    Points
    31 536
    Billets dans le blog
    16
    Par défaut
    Vous savez ced, je n’ai guère de mérite dans cette histoire... Je n’ai fait que reprendre une solution imparable, proposée par Chris Date dans le cadre du problème dit des "quota queries", initialement traité par Ted Codd en 1971 et repris par Date en 1996. Ce problème tourne au départ autour de la question suivante : " Dans l’entreprise, quels sont les départements qui ont les N plus gros budgets ?"

    Source : http://www.amazon.com/Relational-Dat.../dp/0201398141

    Votre question est posée de temps à autre sur ce forum, voyez notamment :

    Otari (Probleme lié avec select MAX) http://www.developpez.net/forums/sho...d.php?t=362771
    Mitch31 (HAVING et/ou GROUP BY ?) http://www.developpez.net/forums/sho...=366300&page=2
    Manu_Karpov (Les 5 dernières factures de chaque vendeur) http://www.developpez.net/forums/sho...d.php?t=269827


    Y'a pas, faut encore que je travaille...
    L’essentiel est de bien assimiler la démarche qui permet d’arriver à la solution. Sur un autre thème, je vous propose de vous intéresser à la division, qui s'applique dès que le mot "tous" apparaît, par exemple : "Quels fournisseurs fournissent tous les produits de telle couleur" :

    Seb981 (Comment rendre correcte cette requête ?) http://www.developpez.net/forums/sho...d.php?t=360501

    Rejul (Problème de jointure) http://www.developpez.net/forums/sho...d.php?t=350388

    Les requêtes de SQLpro : http://sqlpro.developpez.com/cours/divrelationnelle/

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Mille mercis pour toutes ces précisions.

    ced

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/11/2006, 08h14
  2. [SQL Server 2000/05] les n premieres lignes d'un group by
    Par pierre-o dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 12h25
  3. sql server 2000/2005 les cubes
    Par schmur1 dans le forum MS SQL Server
    Réponses: 23
    Dernier message: 03/04/2006, 11h25
  4. [SQL Server 2000] obtenir les enregistrements de x à y
    Par Jahz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/03/2006, 12h22
  5. [SQL server 2000] Détruire les dépendances d'une table
    Par Cyborg289 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 17/02/2006, 11h39

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