【问题标题】:Sort a table but keep groups of rows together对表格进行排序,但将多组行放在一起
【发布时间】:2020-03-13 10:18:05
【问题描述】:

如何按每组的最小值对表格进行排序,但同时将一组行保持在一起。下面是我想要完成的一个简单示例。该表按最低组值排序,但组保持在一起。我很确定这个问题已经被问过了,但我找不到答案。

+---------+-------+
|  Group  | value |
+---------+-------+
|    1    |  3.99 |
|    1    | 10.99 |
|    3    | 12.69 |
|    1    | 20.95 |
|    2    | 19.95 |
|    3    | 10.09 |
+---------+-------+

期望的输出

+---------+-------+
|  Group  | value |
+---------+-------+
|    1    |  3.99 |
|    1    | 10.99 |
|    1    | 20.95 |
|    3    | 10.69 |
|    3    | 12.09 |
|    2    | 19.95 |
+---------+-------+

【问题讨论】:

  • 不幸的是,这不起作用。它将对组进行排序,然后对值进行排序。这不是我想要的,也不会产生所需的输出。我注意到了反对票,如果这个问题是错误的、不清楚的或其他问题,请发表评论,以便我可以编辑和改进它。提前感谢您的帮助。

标签: mysql sql sql-order-by


【解决方案1】:

如果您运行的是 MySQL 8.0,则可以使用窗口函数进行排序:

select t.*
from mytable t
order by min(value) over(partition by grp), value

在早期版本中,一种选择是加入聚合子查询:

select t.*
from mytable t
inner join (
    select grp, min(value) min_value from mytable group by grp
) m on m.grp = t.grp
order by m.min_value, t.value

【讨论】:

  • Running mysql 5.7.2 so: order by min(value) over(partition by grp) 不是一个选项。但未来的有趣选择。
【解决方案2】:

SELECT *,RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY VALUE,ID) FROM TEMP

【讨论】:

  • 请提供一些关于此查询如何解决问题的说明。具体来说,简要描述 OVER 子句及其作用——这对 MySQL 来说是非常新的东西——大多数 MySQL 开发人员可能从未听说过。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多