Faire correspondre les enregistrements entre EventA et l'EventB précédent avant l'EventA suivant dans un ordre spécifique
P粉138711794
P粉138711794 2024-04-01 13:05:30
0
1
326

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粉138711794
P粉138711794

répondre à tous(1)
P粉924915787

C'est un moyen :

  • Calculer le nombre d'événements d'armement et de désarmement, triés par date
  • Trier par nombre d'événements de désarmement, calculer le tri des enregistrements pour chaque nombre d'événements de désarmement

À 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
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!