Retourner au contenu associé (entrée de forum : Requêtes SQL)
Posté par ilip le 22 novembre 2012 à 11:58. 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.
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル
[^] # Re: GROUP BY
Posté par ilip . 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 :
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 :
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:
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.