Maison  >  Questions et réponses  >  le corps du texte

Faire correspondre les enregistrements entre EventA et l'EventB précédent avant l'EventA suivant dans un ordre spécifique

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粉138711794P粉138711794189 Il y a quelques jours291

répondre à tous(1)je répondrai

  • P粉924915787

    P粉9249157872024-04-02 09:46:58

    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

    répondre
    0
  • Annulerrépondre