soit la table history suivante
Soit les données de query suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 ID group timestamp value 1 A 1000 12.1 2 B 2000 2.6 3 C 3000 9.4 4 A 4000 4.7 5 A 5000 -5.3 6 B 6000 3.4
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 A,1200 B,2500 A,3500 A,4700
Je dois retourner pour chaque couple le groupe et le timestamp correspondant au timestamp max < la valeur donnée:
Bon l'idée est que c'est une sous query, en reprenant le groupe + le timestamp et en joignant avec cette sous-query, je retrouve la ligne correspondante dans la table et toutes les données associées
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 group timestamp demande A 1000 1200 B 2000 2500 A 1000 3500 A 4000 4700
Alors avec un seul couple, c'est facile:
La méthode naive avec plusieurs c'est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT groupe, MAX(timestamp) timestamp, '1200' FROM history WHERE timestamp < 1200 AND groupe = 'A'
Mais c'est pas top top coté perfs.
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 SELECT groupe, MAX(timestamp) timestamp, '1200' FROM history WHERE timestamp < 1200 AND groupe = 'B' UNION SELECT groupe, MAX(timestamp) timestamp, '2500' FROM history WHERE timestamp < 1200 AND groupe = 'B' UNION SELECT groupe, MAX(timestamp) timestamp, '3500' FROM history WHERE timestamp < 3500 AND groupe = 'A' UNION SELECT groupe, MAX(timestamp) timestamp, '4700' FROM history WHERE timestamp < 4700 AND groupe = 'A'
Je précise que la table concernée fait plusieurs millions de lignes
En fait il me manque quelque chose dans
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT groupe, MAX(timestamp) timestamp, ??quoi?? FROM history WHERE (timestamp < 1200 AND groupe = 'A' ) OR (timestamp < 2500 AND groupe = 'B' ) OR (timestamp < 3500 AND groupe = 'A' ) OR (timestamp < 4700 AND groupe = 'A' ) GROUP BY groupe, ??quoi??
Alternativement, si quelqu'un a un moyen simple de retourner toutes les lignes de la tables qui correspondent directement au critere "ligne max telle que timestamp < ? et groupe = ?, pour chaque paire.
Il y a une clé sur le couple timestamp/groupe pour aider les perfs.
Partager