2016-01-27 49 views
1

TABLE_1是我的銷售表:的BigQuery:運行最後一個值和表連接

Time | item | ... 
----------------- 
1 | X | ... 
1 | Y | ... 
2 | X | ... 
4 | X | ... 
6 | X | ... 
6 | Y | ... 

TABLE_2是我的成本表

Time | item | Cost 
----------------- 
1 | X | a 
1 | Y | b 
3 | X | c 
4 | X | d 
4 | Y | e 
5 | X | f 

我想要實現的是:
對於每個行TABLE_1,從TABLE_2(至多,TABLE_1行的時間,即)獲得最新的成本值

結果應該是這樣的:

Time | item | ... | Cost 
------------------------ 
1 | X | ... | a 
1 | Y | ... | b 
2 | X | ... | a 
4 | X | ... | d 
6 | X | ... | f 
6 | Y | ... | e 

(我知道它在選擇部分使用子查詢的向前伸直與傳統的SQL或不平等的連接,但BigQuery不允許它)

回答

1

嘗試以下:

SELECT sales.time AS [time], sales.item AS item, cost 
FROM (
    SELECT sales.item, sales.time, cost, 
     cost.time - sales.time AS delta, 
     ROW_NUMBER() OVER(PARTITION BY sales.item, sales.time ORDER BY delta DESC) AS win 
    FROM Table_1 as sales 
    LEFT JOIN Table_2 as cost 
    ON sales.item = cost.item 
    WHERE cost.time - sales.time <= 0 
) 
WHERE win = 1 
ORDER BY 1, 2 

應該給你正是導致你期望

time item cost  
    1  x  a  
    1  y  b  
    2  x  a  
    4  x  d  
    6  x  f  
    6  y  e  
+0

重要的SO - 你可以'標記由全光照接受answer' g在投票答案的左側,在投票下面的勾號。看到http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要!另外一個好的做法是對答案進行投票。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。 –

+0

非常感謝! (和BTW,即「<1」是竊聽我,但你定了!) –

+0

肯定。我意識到這一點昨晚「<1」是這個特定的虛擬實例完全確定,但在實際的例子,它實際上必須是「<= 0」,所以我編輯爲你 –

相關問題