SQL 按日期和可选组排序
SQL Sort by date and optional group
是否可以按日期排序,但将组(如果给定)保持在一组中?
示例数据集:
id | date | group
————————————————————————————
7 | 2021-04-10 |
6 | 2021-04-02 | GGGG
5 | 2021-04-01 |
4 | 2021-04-01 | GGGG
3 | 2021-03-31 | GGGG
2 | 2021-03-30 |
1 | 2021-03-28 | XYZ
预期输出:
id | date | group
————————————————————————————
7 | 2021-04-10 |
6 | 2021-04-02 | GGGG
4 | 2021-04-01 | GGGG
3 | 2021-03-31 | GGGG
5 | 2021-04-01 |
2 | 2021-03-30 |
1 | 2021-03-28 | XYZ
这有点棘手,因为您将 NULL
视为一个单独的组。因此,一种方法是:
order by max(date) over (partition by coalesce(group, -id)) desc,
group, date desc
Here 是一个 db<>fiddle.
之所以可行,是因为两列的值都是正值,因此使用负值不会干扰唯一分区的分配。
编辑:
在 MySQL 的旧版本中,一种可能性是相关子查询:
order by (select max(t2.date)
from t t2
where t2.group = t.group or
(t.group is null and t2.id = t.id))
),
group, date desc
是否可以按日期排序,但将组(如果给定)保持在一组中?
示例数据集:
id | date | group
————————————————————————————
7 | 2021-04-10 |
6 | 2021-04-02 | GGGG
5 | 2021-04-01 |
4 | 2021-04-01 | GGGG
3 | 2021-03-31 | GGGG
2 | 2021-03-30 |
1 | 2021-03-28 | XYZ
预期输出:
id | date | group
————————————————————————————
7 | 2021-04-10 |
6 | 2021-04-02 | GGGG
4 | 2021-04-01 | GGGG
3 | 2021-03-31 | GGGG
5 | 2021-04-01 |
2 | 2021-03-30 |
1 | 2021-03-28 | XYZ
这有点棘手,因为您将 NULL
视为一个单独的组。因此,一种方法是:
order by max(date) over (partition by coalesce(group, -id)) desc,
group, date desc
Here 是一个 db<>fiddle.
之所以可行,是因为两列的值都是正值,因此使用负值不会干扰唯一分区的分配。
编辑:
在 MySQL 的旧版本中,一种可能性是相关子查询:
order by (select max(t2.date)
from t t2
where t2.group = t.group or
(t.group is null and t2.id = t.id))
),
group, date desc