suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Vergleichen Sie Datensätze zwischen EventA und dem vorherigen EventB vor dem nachfolgenden EventA in einer bestimmten Reihenfolge

Ich habe folgende Daten (Geige),

id datec Veranstaltungen
1 2022-09-19 12:16:38 EVENTA
2 2022-09-19 12:16:38 A
3 2022-09-19 12:21:08 B
4 2022-09-19 12:21:12 EVENTD
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 EVENTA
10 2022-09-19 12:25:39 G
11 2022-09-19 12:25:40 H
12 2022-09-19 12:25:48 ich
13 2022-09-19 12:27:18 EVENTD
14 2022-09-19 12:29:08 J

Ich weiß nicht, wie man einen Wert zwischen zwei anderen Werten auswählt, aber in einer bestimmten Reihenfolge. Nur Ereignisse zwischen EVENTA und EVENTD sollten in der richtigen Reihenfolge zurückgegeben werden.

Das Ergebnis sollten also Zeilen mit den IDs 1 bis 4 und 9 bis 13

sein

Ich habe versucht, so etwas wie das Folgende zu machen, aber es hat mir die IDs 1,4,9 und 13 gegeben und den Inhalt dazwischen weggelassen.

SELECT id, datec, event 
FROM table1 
WHERE event BETWEEN 'EVENTA' AND 'EVENTD';

Dann habe ich es versucht,

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));

Es liefert mir die Ergebnisse, aber ich habe viele Zeilen in meiner Tabelle.

Könnte mir bitte jemand zeigen, wie ich das bis zum Ende wiederholen kann, denn ich bin mir sicher, dass es eine Möglichkeit gibt, aber ich weiß nicht wie?

Grüße,

Pierre

P粉138711794P粉138711794241 Tage vor336

Antworte allen(1)Ich werde antworten

  • P粉924915787

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

    这是一种方法:

    • 计算武装事件和解除武装事件的运行计数,按日期排序
    • 按照解除武装事件的数量排序,计算每个武装事件计数的记录排序

    此时您应该注意到,当我们的armed_event分区中还没有EventD时,我们生成的排名值假定为0。当找到第一个EventD时,它的值为1,直到找到下一个EventD。

    因此,当此排名值为 0 或 1 并且事件恰好是“EventD”时,您可以在 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

    输出

    id datec 事件
    1 2022-09-19 12:16:38 活动
    2 2022-09-19 12:16:38 一个
    3 2022-09-19 12:21:08 B
    4 2022-09-19 12:21:12 事件
    9 2022-09-19 12:25:38 活动
    10 2022-09-19 12:25:39 G
    11 2022-09-19 12:25:40 H
    12 2022-09-19 12:25:48
    13 2022-09-19 12:27:18 事件

    Antwort
    0
  • StornierenAntwort