• [^] # Re: GROUP BY

    Posté par . En réponse au message Requêtes SQL. Évalué à 1.

    Bonjour,

    C'est bien ce que je cherchai a faire.

    Pour la première requête ça donne :

    SELECT s, COUNT(status) 
    FROM generate_series(0, 20, 1) AS s
    LEFT JOIN (
     SELECT status 
     FROM donnees
     WHERE timestamp >= 1104537600 
     AND timestamp < 1104624000
     ) d ON s=d.status
    GROUP BY s
    ORDER BY s;
    
    

    La requête sur 229398 lignes me renvoit bien les cumuls :

    0;218584
    1;527
    2;577
    3;557
    4;528
    5;552
    6;544
    7;549
    8;549
    9;566
    10;548
    11;528
    12;578
    13;506
    14;530
    15;540
    16;499
    17;540
    18;528
    19;532
    20;536

    La requête prend 6812 msec ce qui est assez performant.

    Avant j'obtenai le même résultat en faisant une requête COUNT pour chaque valeur de status :

    SELECT COUNT(status) 
     FROM donnees
     WHERE timestamp >= 1104537600 
     AND timestamp < 1104624000
     AND status=0;
    SELECT COUNT(status) 
     FROM donnees
     WHERE timestamp >= 1104537600 
     AND timestamp < 1104624000
     AND status=1;
    ...
    
    

    Ce qui me prenait 51802 msec

    Pour la deuxième requête par contre c'est moins bon au niveau performances et je ne comprend pas pourquoi :

    Je veux répartir la colonne "valeur" dans 15 intervalles différents :

    -∞ à -120
    -120 à -100
    -100 à -80
    -80 à -60
    -60 à -40
    -40 à -20
    -20 à 0
    0 à 20
    20 à 40
    40 à 60
    60 à 80
    80 à 100
    100 à 120
    120 à +∞

    Ma requête est:

    SELECT (s.values*20), COUNT(valeur)
    FROM (SELECT generate_series(-7, 7, 1) AS values) as s
    LEFT JOIN (
     SELECT valeur 
     FROM donnees_brutes 
     WHERE timestamp >= 1104537600 
     AND timestamp < 1104624000
     ) t ON ((t.valeur >= s.values*20) OR (s.values = -7)) AND ((t.valeur < ((s.values*20)+20)) OR (s.values = 7))
    GROUP BY s.values
    ORDER BY s.values;
    
    

    Comme la précédente requête, il y'a 229398 lignes, cela me renvoit :

    -∞;1090
    -120;2325
    -100;1169
    -80;3521
    -60;3437
    -40;17349
    -20;17269
    0;137523
    20;17308
    40;16870
    60;3466
    80;3397
    100;1166
    120;2311
    +∞;1197

    Mais j'ai ce résultat en 43875 msec.

    Alors que si je fais des requêtes COUNT pour chaque intervalles séparément, j'ai le résultat 37738 msec, ce qui est meilleur que la requête groupée.