【问题标题】:SQL Sort by date and optional group [closed]SQL按日期和可选组排序[关闭]
【发布时间】:2021-09-07 04:11:17
【问题描述】:

是否可以按日期排序,但在一组中维护组(如果给定)?

示例数据集:

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

【问题讨论】:

  • 您使用的是 MySQL 8+ 吗?如果是这样,那么请在下面尝试 Gordon 的答案。
  • 不幸的是,这个问题已经关闭,即使我是具体的并发布了示例 - 它已经得到了一个公认的答案。如果有人可以重新打开它会很棒。

标签: mysql sql sorting mysql-8.0


【解决方案1】:

这有点棘手,因为您将NULL 视为一个单独的组。所以,一种方法是:

order by max(date) over (partition by coalesce(group, -id)) desc,
         group, date desc

Here 是一个 dbfiddle。

这是可行的,因为两列的值都是正值,因此使用负值不会干扰唯一分区的分配。

编辑:

在旧版本的 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

【讨论】:

  • 我尝试了你的建议(这次使用 MySQL 8.0),不幸的是我得到了与order by group desc, date desc 相同的输出 // 编辑:它可以选择它作为一个字段,然后按该字段排序
  • @Simon 。 . .我添加了一个 dbfiddle。它的工作原理与宣传的一样。
  • 感谢您的提琴。不幸的是,它仅适用于选择字段(8.0.21)。因为我现在没有时间调试这个案例,这对我来说非常好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多