【发布时间】:2016-06-29 09:57:42
【问题描述】:
如何排序
a 1 15
a 2 3
a 3 34
b 1 55
b 2 44
b 3 8
到(第三列总和):
b 1 55
b 2 44
b 3 8
a 1 15
a 2 3
a 3 34
因为 (55+44+8) > (15+3+34)
【问题讨论】:
-
学校工作,或工作任务,或只是为了好玩?
如何排序
a 1 15
a 2 3
a 3 34
b 1 55
b 2 44
b 3 8
到(第三列总和):
b 1 55
b 2 44
b 3 8
a 1 15
a 2 3
a 3 34
因为 (55+44+8) > (15+3+34)
【问题讨论】:
如果您使用的是 SQL Server/Oracle/Postgresql,您可以使用窗口化SUM:
SELECT *
FROM tab
ORDER BY SUM(col3) OVER(PARTITION BY col) DESC, col2
输出:
╔═════╦══════╦══════╗
║ col ║ col2 ║ col3 ║
╠═════╬══════╬══════╣
║ b ║ 1 ║ 55 ║
║ b ║ 2 ║ 44 ║
║ b ║ 3 ║ 8 ║
║ a ║ 1 ║ 15 ║
║ a ║ 2 ║ 3 ║
║ a ║ 3 ║ 34 ║
╚═════╩══════╩══════╝
【讨论】:
您可以使用 ANSI 标准窗口函数来执行此操作。我更喜欢使用子查询,尽管这不是绝对必要的:
select col1, col2, col3
from (select t.*, sum(col3) over (partition by col1) as sumcol3
from t
) t
order by sumcol3 desc, col3 desc;
【讨论】:
...以及如何在没有窗口函数的情况下执行此操作的示例,例如 MySQL(但也适用于几乎任何其他标准 SQL 版本)
SELECT m.col1, m.col2, m.col3
FROM myTable m
JOIN (
SELECT col1, SUM(col3) groupsum FROM myTable GROUP BY col1
) z ON m.col1 = z.col1
ORDER BY z.groupsum DESC, col2;
基本上,在子查询中计算组总和,并按组的总和降序连接/排序结果。
【讨论】: