我进行PARTITION BY时,ORDER BY有什么用?

时间:2018-11-11 12:33:19

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

我开始学习带有聚合函数的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,如果我不使用它会发生什么? 感谢您的帮助:)

2 个答案:

答案 0 :(得分: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键的行的总和都是相同的。

答案 1 :(得分:0)

ORDER BY主要有两个规则:

  1. 实际定义另一个功能的工作方式。这是真的 例如,使用TOP或在OVER()分区函数中使用。不会 要求进行排序,它只是说“此定义仅使 如果我们认为结果集中的行出现在 特定顺序-这是我要使用的顺序”
  2. 决定结果集的排序顺序。这是真的 最外层陈述式的ORDER BY子句是 特定查询-不在子查询,CTE,OVER()分区中 功能等。