带有ASC的LAST_VALUE()和带有DESC的FIRST_VALUE返回不同的结果

时间:2016-01-21 08:50:35

标签: sql google-bigquery

我在使用Google BigQuery中的LAST_VALUE()窗口函数时遇到了问题。

根据我的理解,以下两列应该返回相同的结果,但实际上它们会返回不同的结果,而FIRST_VALUE()似乎是正确的。

SELECT
  FIRST_VALUE(status) OVER (PARTITION BY userId ORDER BY timestamp DESC), 
  LAST_VALUE(status) OVER (PARTITION BY userId ORDER BY timestamp ASC)
FROM
  [table]

我犯了什么错吗?

1 个答案:

答案 0 :(得分:2)

当OVER()函数具有(ORDER BY)时,它们如何工作有一个微妙之处:它们以增量方式工作。

请参阅此查询:

SELECT x, y, 
       FIRST_VALUE(x) OVER(ORDER BY y) first, 
       LAST_VALUE(x) OVER(ORDER BY y DESC) last,
       SUM(x) OVER() plain_sum_over, 
       SUM(x) OVER(ORDER BY y) sum_over_order
FROM (SELECT 1 x, 1 y),(SELECT 2 x, 2 y),(SELECT 3 x, 3 y),(SELECT 4 x, 4 y)

enter image description here

plain_sum_oversum_over_order揭示了秘密:使用ORDER BY可以获得增量结果 - 这就是您在结果中看到的内容。