sql - 带有附加检查的 SQL 分组
问题描述
我有一个具有以下结构的表
ID | 事件名称 | 活动日期 |
---|---|---|
1 | 一个 | 1.1.2019 |
1 | b | 2.1.2019 |
1 | C | 2.3.2019 |
2 | 一个 | 3.2.2020 |
2 | b | 5.1.2020 |
2 | C | 4.2.2020 |
3 | 一个 | 1.2.2020 |
3 | b | 5.2.2020 |
3 | C | 3.2.2020 |
4 | 一个 | 3.2.2020 |
4 | C | 4.2.2020 |
我想对 id 进行分组,之后我必须检查 event_names 的顺序是否与 event_date 的顺序相匹配,例如 event_date for 'a' < event_date for 'b' < event_date for 'c'。此外,我必须检查事件“b”是否在表中(如果是,则顺序不再重要)。这将导致列“event_check”具有以下值:
- 当“a”的事件日期<“b”的事件日期<“c”的事件日期时“确定”
- 当 'b' 的 event_date < 'a' 的 event_date 时“为时过早”
- 当 'c' 的 event_date < 'b' 的 event_date 时“为时已晚”
- 当组中没有事件“b”时“缺少 b”
在这个例子中,这将导致
ID | 事件检查 |
---|---|
1 | 好的 |
2 | 太早了 |
3 | 为时已晚 |
4 | 缺少 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
推荐阅读
- python - 使用 base64 加密密码
- php - 将 Xampp 升级到 php8 后 Apache 无法启动
- android - 将图像添加到 android 模拟器上的照片库
- android - 'AndroidManifest.xml React native 中的应用程序包名称无效
- python - 我怎样才能使这个 matplotlib“词云”图更好看?
- python - 如何更新 Ursina 窗口面板中包含的文本实体?
- java - geotools - 使用 JDBCDataStore 插入新的 SimpleFeature 时是否可以跳过列
- css - 使用 CSS 影响另一个外部元素
- python - Pandas 数据帧乘法,其中数据帧具有不同的矩阵
- sql - 静态和可变日期之间的 SQL 运行总计