【问题标题】:sql sorting by subgroup sum datasql按子组和数据排序
【发布时间】: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)

【问题讨论】:

  • 学校工作,或工作任务,或只是为了好玩?

标签: sql sorting group-by


【解决方案1】:

如果您使用的是 SQL Server/Oracle/Postgresql,您可以使用窗口化SUM

SELECT *
FROM tab
ORDER BY SUM(col3) OVER(PARTITION BY col) DESC, col2

LiveDemo

输出:

╔═════╦══════╦══════╗
║ col ║ col2 ║ col3 ║
╠═════╬══════╬══════╣
║ b   ║    1 ║   55 ║
║ b   ║    2 ║   44 ║
║ b   ║    3 ║    8 ║
║ a   ║    1 ║   15 ║
║ a   ║    2 ║    3 ║
║ a   ║    3 ║   34 ║
╚═════╩══════╩══════╝

【讨论】:

    【解决方案2】:

    您可以使用 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;
    

    【讨论】:

      【解决方案3】:

      ...以及如何在没有窗口函数的情况下执行此操作的示例,例如 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;
      

      基本上,在子查询中计算组总和,并按组的总和降序连接/排序结果。

      An SQLfiddle to test with.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-15
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2021-03-10
        相关资源
        最近更新 更多