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' 具有以下值:

在此示例中,这将导致

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