【问题标题】:Sort a table into groups of rows, where the groups are ordered by the sum in the group of a column's values - Postgresql将表排序为多组行,其中组按列值组中的总和排序 - Postgresql
【发布时间】:2021-03-09 11:44:36
【问题描述】:

我怎样才能把这张桌子翻过来:

|  User  | ItemID | Quantity | TotalValue (ValueOfItem*Quantity)  |
| UserY  |      1 |        1 |                                 15 | 
| UserX  |      2 |        1 |                                 22 | 
| UserX  |      3 |        1 |                                  7 | 
| UserY  |      3 |        1 |                                  7 | 
| UserX  |      1 |        2 |                                 30 |
| UserY  |      2 |        1 |                                 22 |

进入这张表:

|  User  | ItemID | Quantity | TotalValue (ValueOfItem*Quantity)  |    
| UserX  |      1 |        2 |                                 30 |
| UserX  |      2 |        1 |                                 22 |
| UserX  |      3 |        1 |                                  7 |
| UserY  |      1 |        1 |                                 15 |
| UserY  |      2 |        1 |                                 22 |
| UserY  |      3 |        1 |                                  7 |

我需要:

  • 对用户进行分组,所以 UserX 行都在一起,UserY 行都在一起。
  • 在用户的行中,ItemID 需要按升序排列,即 1、2、3。
  • 用户组需要按用户总价值的降序排列。
    • 即,UserX 高于 UserY,因为 (30+22+7) > (15+22+7)

【问题讨论】:

  • 您的输入表有 UserX/UserY 的 4/2 条记录,但您的预期输出包含 3/3。请修正错误的表格。

标签: sql postgresql sorting


【解决方案1】:

demo:db<>fiddle

您可以使用每个用户的SUM() window function 计算总和。您可以进一步将其用作订单标准。

SELECT
    user,
    item_id,
    quantity,
    total_value
FROM (
    SELECT
        *,
        sum(total_value) OVER (PARTITION BY user) as user_sum
    FROM 
        mytable
)s
ORDER BY user_sum DESC, user, item_id

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2021-06-10
    • 2011-07-15
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多