【问题标题】:what is ORDER BY useful for when i do PARTITION BY当我做 PARTITION BY 时 ORDER BY 有什么用
【发布时间】:2018-11-11 12:33:18
【问题描述】:

我开始学习使用聚合函数的 PARTITION BY 方法,但我不明白为什么要在此查询中使用 ORDER BY。 我想总结每年在“标准纸”上的销售额总额 这是我的代码:

    SELECT standard_amt_usd,
   DATE_TRUNC('year', occurred_at) as year,
   SUM(standard_amt_usd) OVER (PARTITION BY DATE_TRUNC('year', occurred_at) 
   ORDER BY occurred_at) AS running_total
   FROM orders ; 

我得到的答案是正确的,但我仍然不明白为什么需要在这里使用 ORDER BY 以及如果我不使用它会发生什么? 感谢您的帮助:)

【问题讨论】:

    标签: sql postgresql sql-order-by window-functions


    【解决方案1】:

    运行此查询:

    SELECT standard_amt_usd,
           DATE_TRUNC('year', occurred_at) as year,
           SUM(standard_amt_usd) OVER (PARTITION BY DATE_TRUNC('year', occurred_at) 
                                       ORDER BY occurred_at
                                      ) AS running_total,
           SUM(standard_amt_usd) OVER (PARTITION BY DATE_TRUNC('year', occurred_at) 
                                      ) AS group_total
    FROM orders ; 
    

    您可能会立即看到差异。 ORDER BY 表示要对“最多”这一行进行求和。如果没有ORDER BY,则在所有具有相同PARTITION BY 键的行上的总和都是相同的。

    【讨论】:

      【解决方案2】:

      ORDER BY 主要有两条规则:

      1. 实际定义另一个功能的工作方式。这是真的,当 例如,使用 TOP 或在 OVER() 分区函数中。它没有 需要进行排序,它只是说“这个定义只使 如果我们认为结果集中的行发生在一个 特定顺序 - 这是我要使用的顺序”
      2. 规定结果集的排序顺序。这是真的 最外层语句上的 ORDER BY 子句,它是 特定查询 - 不在子查询、CTE、OVER() 分区中 功能等。

      【讨论】:

        猜你喜欢
        • 2013-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        相关资源
        最近更新 更多