对表格进行排序,但将多组行放在一起
Posted
技术标签:
【中文标题】对表格进行排序,但将多组行放在一起【英文标题】: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 |
+---------+-------+
【问题讨论】:
不幸的是,这不起作用。它将对组进行排序,然后对值进行排序。这不是我想要的,也不会产生所需的输出。我注意到了反对票,如果这个问题是错误的、不清楚的或其他问题,请发表评论,以便我可以编辑和改进它。提前感谢您的帮助。 【参考方案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 开发人员可能从未听说过。以上是关于对表格进行排序,但将多组行放在一起的主要内容,如果未能解决你的问题,请参考以下文章