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