Maison > Questions et réponses > le corps du texte
J'ai les données suivantes (violon),
id | datec | Événements |
---|---|---|
1 | 2022-09-19 12:16:38 | ÉVÉNEMENT |
2 | 2022-09-19 12:16:38 | A |
3 | 2022-09-19 12:21:08 | B |
4 | 2022-09-19 12:21:12 | ÉVÉNEMENT |
5 | 2022-09-19 12:25:18 | C |
6 | 2022-09-19 12:25:18 | D |
7 | 2022-09-19 12:25:28 | E |
8 | 2022-09-19 12:25:29 | F |
9 | 2022-09-19 12:25:38 | ÉVÉNEMENT |
10 | 2022-09-19 12:25:39 | G |
11 | 2022-09-19 12:25:40 | H |
12 | 2022-09-19 12:25:48 | moi |
13 | 2022-09-19 12:27:18 | ÉVÉNEMENT |
14 | 2022-09-19 12:29:08 | J |
Je ne sais pas comment sélectionner une valeur entre deux autres valeurs mais dans un ordre précis. Seuls les événements entre EVENTA et EVENTD doivent être renvoyés dans l'ordre.
Le résultat devrait donc être des lignes avec les identifiants 1 à 4 et 9 à 13
J'ai essayé de faire quelque chose comme ce qui suit, mais cela m'a donné les identifiants 1,4,9 et 13, en omettant le contenu intermédiaire.
SELECT id, datec, event FROM table1 WHERE event BETWEEN 'EVENTA' AND 'EVENTD';
Ensuite, j'ai essayé d'utiliser ceci,
SELECT id, datec, event FROM table1 WHERE (id BETWEEN (SELECT id FROM table1 WHERE event BETWEEN 'EVENTA' AND 'EVENTD' LIMIT 1) AND (SELECT id FROM table1 WHERE event BETWEEN 'EVENTA' AND 'EVENTD' LIMIT 1,1)) OR (id BETWEEN (SELECT id FROM table1 WHERE event BETWEEN 'EVENTA' AND 'EVENTD' LIMIT 2,1) AND (SELECT id FROM table1 WHERE event BETWEEN 'EVENTA' AND 'EVENTD' LIMIT 3,1));
Cela me donne les résultats mais j'ai beaucoup de lignes dans mon tableau.
Quelqu'un pourrait-il me guider comment répéter cela jusqu'à la fin car je suis sûr qu'il existe un moyen de le faire mais je ne sais pas comment ?
Salut,
Pierre
P粉9249157872024-04-02 09:46:58
C'est un moyen :
À ce stade, vous devriez remarquer que lorsqu'il n'y a pas encore d'EventD dans notre partition armé_event, la valeur de classement que nous générons est supposée être 0. Lorsque le premier EventD est trouvé, sa valeur est 1 jusqu'à ce que le prochain EventD soit trouvé.
Ainsi, lorsque cette valeur de classement est 0 ou 1 et que l'événement s'avère être "EventD", vous pouvez filtrer en conséquence dans la clause WHERE
.
WITH cte AS ( SELECT *, SUM(`event`='EVENTA') OVER(ORDER BY datec, id) AS armed_events, SUM(`event`='EVENTD') OVER(ORDER BY datec, id) AS disarmed_events FROM Table1 ), cte2 AS ( SELECT *, DENSE_RANK() OVER(PARTITION BY armed_events ORDER BY disarmed_events) -1 AS rn FROM cte ) SELECT `id`, `datec`, `event` FROM cte2 WHERE rn = 0 OR (rn = 1 AND `event` = 'EVENTD') ORDER BY id
Sortie :
id | datec | Événements |
---|---|---|
1 | 2022-09-19 12:16:38 | Activités |
2 | 2022-09-19 12:16:38 | un |
3 | 2022-09-19 12:21:08 | B |
4 | 2022-09-19 12:21:12 | Événements |
9 | 2022-09-19 12:25:38 | Activités |
10 | 2022-09-19 12:25:39 | G |
11 | 2022-09-19 12:25:40 | H |
12 | 2022-09-19 12:25:48 | moi |
13 | 2022-09-19 12:27:18 | Événements |