SQL 使用附加检查进行分组
SQL Grouping with Additional Checks
我有一个table结构如下
id
event_name
event_date
1
a
1.1.2019
1
b
2.1.2019
1
c
2.3.2019
2
a
3.2.2020
2
b
5.1.2020
2
c
4.2.2020
3
a
1.2.2020
3
b
5.2.2020
3
c
3.2.2020
4
a
3.2.2020
4
c
4.2.2020
我想在 id 上分组,之后我必须检查 event_names 的顺序是否与 event_date 的顺序匹配,例如 event_date 对 'a' < event_date 'b' < event_date 'c'。此外,我必须检查事件 'b' 是否在 table 中(如果是这样,顺序不再重要)。这将导致列 'event_check' 具有以下值:
- “确定”,当 event_date 对于 'a' < event_date 对于 'b' < event_date 对于 'c'
- 当 event_date 对于 'b' < event_date 对于 'a'
时“太早”
- 当 event_date 对于 'c' < event_date 对于 'b'
时“太晚了”
- 组中没有事件 'b' 时“缺少 b”
在此示例中,这将导致
id
event_check
1
ok
2
too early
3
too late
4
missing b
尝试以下 SQL 语句,它应该适用于大多数 DBMS。
SELECT
id,
CASE
WHEN event_date_a < event_date_b AND event_date_b < event_date_c THEN 'ok'
WHEN event_date_b < event_date_a THEN 'too early'
WHEN event_date_c < event_date_b THEN 'too late'
WHEN event_date_b IS NULL THEN 'missing b'
END AS event_check
FROM (
SELECT
id,
MIN(CASE WHEN event_name = 'a' THEN event_date END) AS event_date_a,
MIN(CASE WHEN event_name = 'b' THEN event_date END) AS event_date_b,
MIN(CASE WHEN event_name = 'c' THEN event_date END) AS event_date_c
FROM mytable
GROUP BY id
) agg
我有一个table结构如下
id | event_name | event_date |
---|---|---|
1 | a | 1.1.2019 |
1 | b | 2.1.2019 |
1 | c | 2.3.2019 |
2 | a | 3.2.2020 |
2 | b | 5.1.2020 |
2 | c | 4.2.2020 |
3 | a | 1.2.2020 |
3 | b | 5.2.2020 |
3 | c | 3.2.2020 |
4 | a | 3.2.2020 |
4 | c | 4.2.2020 |
我想在 id 上分组,之后我必须检查 event_names 的顺序是否与 event_date 的顺序匹配,例如 event_date 对 'a' < event_date 'b' < event_date 'c'。此外,我必须检查事件 'b' 是否在 table 中(如果是这样,顺序不再重要)。这将导致列 'event_check' 具有以下值:
- “确定”,当 event_date 对于 'a' < event_date 对于 'b' < event_date 对于 'c'
- 当 event_date 对于 'b' < event_date 对于 'a' 时“太早”
- 当 event_date 对于 'c' < event_date 对于 'b' 时“太晚了”
- 组中没有事件 'b' 时“缺少 b”
在此示例中,这将导致
id | event_check |
---|---|
1 | ok |
2 | too early |
3 | too late |
4 | missing b |
尝试以下 SQL 语句,它应该适用于大多数 DBMS。
SELECT
id,
CASE
WHEN event_date_a < event_date_b AND event_date_b < event_date_c THEN 'ok'
WHEN event_date_b < event_date_a THEN 'too early'
WHEN event_date_c < event_date_b THEN 'too late'
WHEN event_date_b IS NULL THEN 'missing b'
END AS event_check
FROM (
SELECT
id,
MIN(CASE WHEN event_name = 'a' THEN event_date END) AS event_date_a,
MIN(CASE WHEN event_name = 'b' THEN event_date END) AS event_date_b,
MIN(CASE WHEN event_name = 'c' THEN event_date END) AS event_date_c
FROM mytable
GROUP BY id
) agg