2016-01-21 49 views
1

我在使用Google BigQuery中的LAST_VALUE()窗口函數時遇到問題。帶有ASC的LAST_VALUE()和帶有DESC的FIRST_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] 

我犯了什麼錯誤嗎?

+0

沒有空或重複。更糟的是,使用LAST_VALUE的那個會爲同一個userId返回不同的結果。 – yuzwyy

+0

這是一個功能,而不是bug ..檢查下面的答案 –

+0

你有一個低利率。重要的是,您必須使用投票下方發佈答案左側的勾號標記接受的答案。這會增加你的速度。看看這個工程通過visinting這個鏈接:http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work#5235 – Pentium10

回答

0

OVER()函數在具有(ORDER BY)時如何工作有一個微妙之處:它們以遞增方式工作。 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泄露祕密。

+0

謝謝! 我明白SUM()增量工作,但LAST_VALUE()也增量工作? 如果我想獲得每個用戶的最後狀態,最好的方法是什麼? – yuzwyy

+1

好的。我想現在我明白了這種行爲。因此,如果在沒有窗口框架子句的OVER子句中有ORDER BY,則默認窗口框架爲RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。它是否正確? – yuzwyy

+0

Correcto!就是這樣 –