【发布时间】:2022-01-01 14:48:30
【问题描述】:
示例表:
| id | name | create_time | group_id |
|---|---|---|---|
| 1 | a | 2022-01-01 12:00:00 | group1 |
| 2 | b | 2022-01-01 13:00:00 | group1 |
| 3 | c | 2022-01-01 12:00:00 | NULL |
| 4 | d | 2022-01-01 13:00:00 | NULL |
| 5 | e | NULL | group2 |
我需要在以下条件下按group_id 分组的前 1 行(最小的create_time):
-
create_time可以为 null - 它应该被视为最小值 -
group_id可以为 null - 应返回所有可以为 null 的行group_id - 应该可以对查询应用分页(因此连接可能是个问题)
- 查询应尽可能通用(因此没有特定于供应商的内容)。同样,如果不可能,它应该可以在 MySQL 5&8、PostgreSQL 9+ 和 H2 中运行
示例的预期输出:
| id | name | create_time | group_id |
|---|---|---|---|
| 1 | a | 2022-01-01 12:00:00 | group1 |
| 3 | c | 2022-01-01 12:00:00 | NULL |
| 4 | d | 2022-01-01 13:00:00 | NULL |
| 5 | e | NULL | group2 |
我已经阅读过关于 SO 的类似问题,但 90% 的答案是使用特定关键字(PARTITION BY 的许多答案,如 https://stackoverflow.com/a/6841644/5572007),其他人不尊重组条件列中的空值,并且可能分页(比如https://stackoverflow.com/a/14346780/5572007)。
【问题讨论】:
-
窗口函数是标准sql。
-
您的问题是minimal reproducible example,应该包含足够的数据和预期的输出。不是每个人都是以英语为母语的人,并且可以理解您所说的意思:“1 rows with lesser create_time”。这就是为什么您应该指定所需的输出,以及您自己尝试编写此查询的原因是什么?您在哪里遇到问题?
-
问题已更新
-
前 1 行是什么意思?只有一排?您的示例输出有 4 行。
-
您说,如果 create_time 为 null,则应将其视为最小值。在您的示例输出中,它被视为最大值。
标签: sql group-by greatest-n-per-group