对表格进行排序,但将多组行放在一起

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 开发人员可能从未听说过。

以上是关于对表格进行排序,但将多组行放在一起的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 created_at 对一组行进行排序?

ACM-冒泡排序

如何在熊猫中将一组行混在一起(行具有唯一的ID)

[编程题] 排序题-对多组输入进行排序-民生银行笔试

EXCEL如何将多组数据画在一张图上,图例成分组效果(见附图)

将多组参数分配给 jQuery 函数