Heim > Fragen und Antworten > Hauptteil
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
seinIch 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粉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 | 事件 |