LAST_VALUE() 与 ASC 和 FIRST_VALUE 与 DESC return 不同的结果
LAST_VALUE() with ASC and FIRST_VALUE with DESC return different results
我在 Google BigQuery 中使用 LAST_VALUE()
window 函数时遇到问题。
以我的理解,以下两列应该return相同的结果,但实际上它们return不同的结果,看起来 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]
我是不是搞错了?
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)
plain_sum_over
和 sum_over_order
揭示了秘密:使用 ORDER BY 可以获得增量结果 - 这就是您在结果中看到的。
我在 Google BigQuery 中使用 LAST_VALUE()
window 函数时遇到问题。
以我的理解,以下两列应该return相同的结果,但实际上它们return不同的结果,看起来 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]
我是不是搞错了?
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)
plain_sum_over
和 sum_over_order
揭示了秘密:使用 ORDER BY 可以获得增量结果 - 这就是您在结果中看到的。