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 :

SELECT DISTINCT et COUNT : Question de débutant


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2022
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2022
    Messages : 45
    Par défaut SELECT DISTINCT et COUNT : Question de débutant
    Bonjour

    Actuellement J'imagine extraire de ma base de données une liste de dates.
    Boucler sur ces dernières pour en extraire des données.
    Vérifier si le nombre de lignes retournées est égal à 28 et si c'est le cas, exploiter le résultat.
    Tout ça je sais faire avec SQLite/Delphi, mais en 3 étapes.

    J'imagine qu'il est possible de faire tout cela en une seule requête au regard de la puissance du SQL mais je me trompe peut être.

    J'ai cherché et ne trouve pas d'exemple de DISTINCT en filtre de recherche, ni même la possibilité de filtrer les résultats pour ne conserver que ceux qui sont au nombre de 28 pour une date précise.

    Dans mon cas la requête en Pseudo Code serait (je ne suis pas au travail donc je ne peux présenter une vraie requête, d ailleurs je ne sais pas l'écrire, d'où mon post...):

    Select PC,Vol ,dans la table tb_Pc, pour toutes dates différentes traitées individuellement ET quand le nombre de résultats est égal à 28

    Je pense que filtrer par le nombre de résultats augmentera le temps de traitement SQL alors qu'un simple dénombrement des résultats avant le traitement des données sera plus rapide (selon moi). Donc je ne me focalise pas sur cette partie de la requête.

    Pour info J ai une table tb_Pc avec 'potentiellement' 28 lignes pour chaque date. Les lignes sont composées de 4 colonnes (ROWID, LaDate, Pc, Vol).

    Auriez-vous quelques pistes SVP

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    A priori, c'est tout à fait faisable en SQL
    une restriction sur le résultat d'un agrégat se fait avec la clause HAVING.
    Dans votre cas, ça donnerait HAVING COUNT(distinct ma_colonne)=28.

    Pour une solution concrète, il faut que vous communiquiez la description exacte des tables en jeu, un extrait de leur contenu et un exemple de résultat attendu.

  3. #3
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2022
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2022
    Messages : 45
    Par défaut
    Merci pour votre réponse.
    Comme demandé voici la description exacte des tables en jeu, un extrait de leur contenu et un exemple de résultat attendu.

    La structure de ma table est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE [tb_pc](
      [LaDate] TEXT, 
      [Paire] TEXT, 
      [Pc] NUMERIC(12, 9), 
      [Volume] NUMERIC(12));
     
    CREATE INDEX [idx_ladate] ON [tb_pc]([LaDate]);
    Pour les données je vous présente 4 jeux :

    Ici seulement 25 lignes pour cette date (ne devra donc pas apparaitre dans les résultats):
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    2021-09-01 19:00,AUDCAD,-0,0548233827102074,2953
    2021-09-01 19:00,AUDCHF,-0,0518695259125303,2176
    2021-09-01 19:00,AUDJPY,-0,0320738191283352,2979
    2021-09-01 19:00,AUDNZD,-0,0354769735264987,3328
    2021-09-01 19:00,AUDUSD,-0,109845402766484,2104
    2021-09-01 19:00,CADCHF,0,00275759372372079,2464
    2021-09-01 19:00,CADJPY,0,0241024699292993,2440
    2021-09-01 19:00,CHFJPY,0,0191476785521027,1900
    2021-09-01 19:00,EURAUD,0,0392195923652464,2776
    2021-09-01 19:00,EURCAD,-0,0133828498778852,2632
    2021-09-01 19:00,EURCHF,-0,0110698043412128,1405
    2021-09-01 19:00,EURGBP,0,00116318293378299,1752
    2021-09-01 19:00,EURJPY,0,00691106230706687,1725
    2021-09-01 19:00,EURNZD,0,00775938736652751,4121
    2021-09-01 19:00,EURUSD,-0,070063479200425,1621
    2021-09-01 19:00,GBPAUD,0,0412132760272518,3831
    2021-09-01 19:00,GBPCAD,-0,01380762526105,3747
    2021-09-01 19:00,GBPCHF,-0,0126900533775287,2771
    2021-09-01 19:00,GBPJPY,0,00528174825867137,2727
    2021-09-01 19:00,GBPNZD,0,00153949576381912,2965
    2021-09-01 19:00,GBPUSD,-0,071849507939733,2109
    2021-09-01 19:00,NZDCAD,-0,0168187832170953,2457
    2021-09-01 19:00,NZDCHF,-0,0216413411448246,3223
    2021-09-01 19:00,NZDJPY,0,00128671976530392,2171
    2021-09-01 19:00,USDJPY,0,0764143477034698,1637
    Ici 27 lignes (ne devra donc pas apparaitre dans les résultats):
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    2021-09-07 09:00,AUDCAD,-0,0515380898695454,5614
    2021-09-07 09:00,AUDCHF,-0,181431985131426,4770
    2021-09-07 09:00,AUDJPY,-0,174183972621219,7517
    2021-09-07 09:00,AUDNZD,-0,0874092288777044,4012
    2021-09-07 09:00,AUDUSD,-0,209007551240566,6220
    2021-09-07 09:00,CADCHF,-0,130524985230064,5072
    2021-09-07 09:00,CADJPY,-0,119972577696522,6019
    2021-09-07 09:00,CHFJPY,0,00914875036387123,5811
    2021-09-07 09:00,EURAUD,0,121156860663369,11189
    2021-09-07 09:00,EURCAD,0,069730798886993,9355
    2021-09-07 09:00,EURCHF,-0,0561880549721766,3122
    2021-09-07 09:00,EURGBP,-0,0500319972075219,4709
    2021-09-07 09:00,EURJPY,-0,0520885198434258,7796
    2021-09-07 09:00,EURNZD,0,0251920896838423,9386
    2021-09-07 09:00,EURUSD,-0,090096158703954,6625
    2021-09-07 09:00,GBPAUD,0,17230366239218,7089
    2021-09-07 09:00,GBPCAD,0,125059792412265,5767
    2021-09-07 09:00,GBPCHF,-0,00870859459117269,6868
    2021-09-07 09:00,GBPJPY,-0,00329194264118857,7196
    2021-09-07 09:00,GBPNZD,0,0757853058994007,5032
    2021-09-07 09:00,GBPUSD,-0,0361867816923877,5296
    2021-09-07 09:00,NZDCAD,0,0447207191091618,5738
    2021-09-07 09:00,NZDCHF,-0,0860109356761062,5268
    2021-09-07 09:00,NZDJPY,-0,0804649083594121,5761
    2021-09-07 09:00,USDCAD,0,160053510427367,4658
    2021-09-07 09:00,USDCHF,0,0295366035093813,3160
    2021-09-07 09:00,USDJPY,0,0354790582584271,4347
    et Enfin 2 dates où j'ai bien mes 28 lignes, ce que je souhaite extraire.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    2021-10-20 19:00,AUDCAD,0,0464242528934237,3311
    2021-10-20 19:00,AUDCHF,-0,0274880282403309,2601
    2021-10-20 19:00,AUDJPY,0,0395827512340495,3875
    2021-10-20 19:00,AUDNZD,-0,0229964355524799,3235
    2021-10-20 19:00,AUDUSD,-0,0265897337038177,4467
    2021-10-20 19:00,CADCHF,-0,0723705371502152,2994
    2021-10-20 19:00,CADJPY,-0,00539223087375611,2910
    2021-10-20 19:00,CHFJPY,0,0659938513045818,2271
    2021-10-20 19:00,EURAUD,-0,00387244176815394,3741
    2021-10-20 19:00,EURCAD,0,0390173209035311,3922
    2021-10-20 19:00,EURCHF,-0,029876107516651,1746
    2021-10-20 19:00,EURGBP,0,0178018300281304,1744
    2021-10-20 19:00,EURJPY,0,033809674074732,5113
    2021-10-20 19:00,EURNZD,-0,0272083603871062,5582
    2021-10-20 19:00,EURUSD,-0,0291705274717672,2310
    2021-10-20 19:00,GBPAUD,-0,0217549737308671,7768
    2021-10-20 19:00,GBPCAD,0,0264208548614345,6634
    2021-10-20 19:00,GBPCHF,-0,0456319234642456,2025
    2021-10-20 19:00,GBPJPY,0,0183605893116028,3043
    2021-10-20 19:00,GBPNZD,-0,0422114637997558,3428
    2021-10-20 19:00,GBPUSD,-0,0469938401920201,2112
    2021-10-20 19:00,NZDCAD,0,0687362668319386,3606
    2021-10-20 19:00,NZDCHF,-0,00453049019903815,4377
    2021-10-20 19:00,NZDJPY,0,0595389980437106,2644
    2021-10-20 19:00,NZDUSD,-0,00277519530437409,2185
    2021-10-20 19:00,USDCAD,0,0730881361713198,3346
    2021-10-20 19:00,USDCHF,-0,00217639697481306,1575
    2021-10-20 19:00,USDJPY,0,063926860665717,2496
     
    2021-10-20 20:00,AUDCAD,-0,139208132344847,2335
    2021-10-20 20:00,AUDCHF,-0,127347978350839,1768
    2021-10-20 20:00,AUDJPY,-0,13964855114629,2366
    2021-10-20 20:00,AUDNZD,-0,0383362085489846,1947
    2021-10-20 20:00,AUDUSD,-0,07048153516763,2191
    2021-10-20 20:00,CADCHF,-0,0590112926155347,1651
    2021-10-20 20:00,CADJPY,-0,0194130779435119,2003
    2021-10-20 20:00,CHFJPY,0,0257367134216972,1284
    2021-10-20 20:00,EURAUD,-0,00968147933004195,2352
    2021-10-20 20:00,EURCAD,-0,0807900711788453,2463
    2021-10-20 20:00,EURCHF,-0,0177442401262642,1738
    2021-10-20 20:00,EURGBP,-0,0427167876975596,2141
    2021-10-20 20:00,EURJPY,0,0217810925095569,2513
    2021-10-20 20:00,EURNZD,0,0253601449857989,3373
    2021-10-20 20:00,EURUSD,-0,0317536602529928,1430
    2021-10-20 20:00,GBPAUD,0,010879853774765,2820
    2021-10-20 20:00,GBPCAD,-0,0686760778328946,2065
    2021-10-20 20:00,GBPCHF,-0,0732018324071535,1249
    2021-10-20 20:00,GBPJPY,0,0132931584544493,1492
    2021-10-20 20:00,GBPNZD,0,0401438923935188,1591
    2021-10-20 20:00,GBPUSD,-0,0224229842822045,1108
    2021-10-20 20:00,NZDCAD,-0,146386505416296,2843
    2021-10-20 20:00,NZDCHF,-0,13139016839085,2080
    2021-10-20 20:00,NZDJPY,-0,173653276339436,1727
    2021-10-20 20:00,NZDUSD,-0,117949073752864,2146
    2021-10-20 20:00,USDCAD,-0,057616307849622,2368
    2021-10-20 20:00,USDCHF,-0,0184997769144575,840
    2021-10-20 20:00,USDJPY,0,0201284721614432,1440
    J'aimerais obtenir les lignes complètes pour les deux dernières dates à savoir 2021-10-20 20:00 et 2021-10-20 19:00 étant donné que ce sont les seules à avoir 28 lignes en deux fois, c est à dire un premier enregistrement/résultat avec la date 2021-10-20 19:00 puis un autre avec la date suivante à savoir 2021-10-20 20:00

    Merci pour votre aide

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    voici une possibilité :

    Code SQL : 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
    18
    19
    with T2 (ladate, paire, pc, volume, RN) as 
        (select ladate
              , paire
              , pc
              , volume
              , row_number() 
                over (partition by ladate
                      order by ladate)
         from tb_pc
        )
    select * 
    from T2 as T2
    where RN=28
      and not exists
         (select 1
          from T2 as S2
          where S2.ladate=T2.ladate
            and S2.RN>28
         )

    À noter :
    • les crochets sont inutiles si les noms de tables et de colonnes ne sont pas des mots réservés SQL
    • le symbole décimal est le point et non pas la virgule

  5. #5
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2022
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2022
    Messages : 45
    Par défaut
    Merci pour cette réponse.
    J'étais à mille lieues de m'en approcher.
    Toutefois il y a un problème car elle n'affiche que la 28éme ligne. Toutes les 28émes lignes mais dans mon cas précis je n'ai que les 28 émes lignes avec Paire=USDJPY.

    Pour ce qui est des décimale et des crochets, merci. Je ne savais pas que l'on pouvait utiliser un nom réservé entre crochets pour nommer une colonne. Les crochets ici le sont pke extrait de SQLite expert, ce que je suis loin d'être
    Pour

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    J'avais interprété cette demande
    Citation Envoyé par SP506 Voir le message
    J'aimerais obtenir les lignes complètes pour les deux dernières dates à savoir 2021-10-20 20:00 et 2021-10-20 19:00 étant donné que ce sont les seules à avoir 28 lignes en deux fois, c est à dire un premier enregistrement/résultat avec la date 2021-10-20 19:00 puis un autre avec la date suivante à savoir 2021-10-20 20:00
    Comme le souhait de n'avoir qu'une seule ligne pour chaque date distincte si pour cette date il y a 28 lignes.
    Ce n'est pas le cas, il faut restituer toutes les 28 lignes quand il y en a 28, mais aucune s'il y en a moins ou plus que 28 ?

    En ce cas, la requête devient :

    Code SQL : 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
    18
    19
    20
    21
    22
    23
    24
    with T2 (ladate, paire, pc, volume, RN) as 
        (select ladate
              , paire
              , pc
              , volume
              , row_number() 
                over (partition by ladate
                      order by ladate)
         from tb_pc
        )
    select * 
    from T2 as T2
    where exists
         (select 1
          from T2 as S2
          where S2.ladate=T2.ladate
            and S2.RN=28
         )
      and not exists
         (select 1
          from T2 as S2
          where S2.ladate=T2.ladate
            and S2.RN>28
         )

  7. #7
    Membre averti
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2022
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2022
    Messages : 45
    Par défaut
    Merci.
    Désolé, je me suis très certainement mal exprimé.
    Je cherche donc à extraire les tous les résultats pour une date s'ils sont au nombre de 28 par "paquet" de 28.
    Comme je peux le faire en 2 fois avec un distinct sur la date puis en sélectionnant tous les résultats pour chaque date distincte s ils sont au nombre de 28.
    C'est pour cela que j e m interrogeais sur la possibilité de le réaliser en une seule requête en SQL.
    Typiquement, si je fais un LIMIT 1 sur la requête j'aimerais avoir mes 28 lignes pour la première date.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 624
    Billets dans le blog
    10
    Par défaut
    Donc la requête de ma réponse n°6 répond au besoin

Discussions similaires

  1. Select distinct et count
    Par Basicnav dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/01/2021, 13h21
  2. Pb constitution requete avec Select, Distinct et Count
    Par Anaxagore dans le forum VBA Access
    Réponses: 2
    Dernier message: 16/12/2011, 23h32
  3. select distinct à deux niveaux pour count sans doublon
    Par vonwolf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/11/2008, 23h45
  4. [SELECT DISTINCT] [Débutant] Ne garder qu'une ligne par id
    Par toniolol dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 12/12/2005, 16h07
  5. [MS sql] (débutant) distinct et count
    Par damn dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/05/2005, 13h25

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