Bonjour,
Je commence à être un peu moins débutant en MySQL et je commence à faire un peu plus attention à la façon dont je fais les choses :
J'ai une table qui contient ceci (des datas HIght value, LOw value selon un DatetTime) :
Je souhaite obtenir, en MySQL (car j’apprends un peu), pour chaque lignes la différance (rdif) entre le ‘hi’ de la ligne et le ‘lo’ d’il y à 10 minute.
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 mysql> select dt, hi, lo from mytable where dt >='2022-10-03 09:20:00' limit 20; +---------------------+--------+--------+ | dt | hi | lo | +---------------------+--------+--------+ | 2022-10-03 09:21:00 | 4.1200 | 4.1180 | | 2022-10-03 09:24:00 | 4.1080 | 4.1040 | | 2022-10-03 09:25:00 | 4.1040 | 4.1000 | | 2022-10-03 09:26:00 | 4.0960 | 4.0940 | | 2022-10-03 09:28:00 | 4.0940 | 4.0920 | | 2022-10-03 09:29:00 | 4.0980 | 4.0940 | | 2022-10-03 09:31:00 | 4.1020 | 4.0980 | | 2022-10-03 09:32:00 | 4.1000 | 4.1000 | | 2022-10-03 09:33:00 | 4.0940 | 4.0940 | | 2022-10-03 09:36:00 | 4.0720 | 4.0720 | | 2022-10-03 09:37:00 | 4.0600 | 4.0500 | | 2022-10-03 09:39:00 | 4.0620 | 4.0560 | | 2022-10-03 09:42:00 | 4.0660 | 4.0580 | | 2022-10-03 09:47:00 | 4.0620 | 4.0620 | | 2022-10-03 09:48:00 | 4.0620 | 4.0620 | | 2022-10-03 09:50:00 | 4.0580 | 4.0580 | | 2022-10-03 09:51:00 | 4.0580 | 4.0580 | | 2022-10-03 09:52:00 | 4.0560 | 4.0540 | | 2022-10-03 09:53:00 | 4.0460 | 4.0460 | | 2022-10-03 09:55:00 | 4.0420 | 4.0360 | +---------------------+--------+--------+ 20 rows in set (0,00 sec)
J’y arrive comme ceci :
(Je sais, les ‘as’ sont facultatif, mais ca permet de mieux comprendre)
Les ‘NULL’ c’est normal car il n’y à pas toujours la minute antérieur qui correspond (en plus ca m’arrange dans ce cas)
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 mysql> select dt as rdt, hi as rhi, (select lo from mytable where dt = rdt-interval 10 minute) as rlo, (hi-(select rlo)) as rdif from mytable where dt >= '2022-10-03 09:20:00' limit 20; +---------------------+--------+--------+---------+ | rdt | rhi | rlo | rdif | +---------------------+--------+--------+---------+ | 2022-10-03 09:21:00 | 4.1200 | 3.9900 | 0.1300 | | 2022-10-03 09:24:00 | 4.1080 | 4.0180 | 0.0900 | | 2022-10-03 09:25:00 | 4.1040 | 4.0500 | 0.0540 | | 2022-10-03 09:26:00 | 4.0960 | 4.0800 | 0.0160 | | 2022-10-03 09:28:00 | 4.0940 | NULL | NULL | | 2022-10-03 09:29:00 | 4.0980 | NULL | NULL | | 2022-10-03 09:31:00 | 4.1020 | 4.1180 | -0.0160 | | 2022-10-03 09:32:00 | 4.1000 | NULL | NULL | | 2022-10-03 09:33:00 | 4.0940 | NULL | NULL | | 2022-10-03 09:36:00 | 4.0720 | 4.0940 | -0.0220 | | 2022-10-03 09:37:00 | 4.0600 | NULL | NULL | | 2022-10-03 09:39:00 | 4.0620 | 4.0940 | -0.0320 | | 2022-10-03 09:42:00 | 4.0660 | 4.1000 | -0.0340 | | 2022-10-03 09:47:00 | 4.0620 | 4.0500 | 0.0120 | | 2022-10-03 09:48:00 | 4.0620 | NULL | NULL | | 2022-10-03 09:50:00 | 4.0580 | NULL | NULL | | 2022-10-03 09:51:00 | 4.0580 | NULL | NULL | | 2022-10-03 09:52:00 | 4.0560 | 4.0580 | -0.0020 | | 2022-10-03 09:53:00 | 4.0460 | NULL | NULL | | 2022-10-03 09:55:00 | 4.0420 | NULL | NULL | +---------------------+--------+--------+---------+ 20 rows in set (0,00 sec)
Mais je me pose des questions :
1)
Dans « (hi-(select rlo)) as rdif » pourquoi je ne peu pas simplement utiliser ‘rlo’ (il faut un ajouter le select) ?
(Même si vous répondez à la question ci-dessous, merci quand même de répondre à celle-ci)
2)
Comment éviter le double select-from dans la table ? (c’est ça une sous requête ?)
Il doit y avoir mieux… Que proposer vous ?
3)
J’envisage ensuite d’autre opérations, dans ce style, plus ou moins simples mais compliquées pour moi en MySQL. (calculs plus des update de colonnes..., pas nécessairement des sélections à afficher...)
Ai-je meilleur temps de lire/écrire simplement la table et de coder ces calculs dans mon appli en nodejs (que je maitrise : J’apprends un peu MySQL, ok, mais je veux quand même avancer…)
(Quant serait-il du temps d’exécution ?)
Merci !
Partager