2016-09-14 94 views
0

我目前正在嘗試計算谷歌大查詢行之間的時間戳差異附加是我用來測試代碼sample table的示例表。谷歌大查詢行之間的時間差異

我使用此代碼

SELECT 
    A.row, 
    A.issue.updated_at, 
(B.issue.updated_at - A.issue.updated_at) AS timedifference 
FROM [icxmedia-servers:icx_metrics.gh_zh_data_production] A 
INNER JOIN [icxmedia-servers:icx_metrics.gh_zh_data_production] B 
    ON B.row = (A.row + 1) 
WHERE issue.number==6 and issue.name=="archer" 
ORDER BY A.requestid ASC 

從這個問題Calculate the time difference between of two rows

回答

2

JOIN而是引用,這是更自然的使用解析函數來表示。 analytic functions with standard SQL in BigQuery的文檔解釋了分析函數的工作原理和語法。舉個例子,如果你想採取如命令是由y列決定在x值連續的差異,你可以這樣做:

WITH T AS (
    SELECT 
    x, 
    y 
    FROM UNNEST([9, 3, 4, 7]) AS x WITH OFFSET y) 
SELECT 
    x, 
    x - LAG(x) OVER (ORDER BY y) AS x_diff 
FROM T; 

注意,要BigQuery中運行這個,你需要取消選中「使用舊式SQL「框下的」顯示選項「來啓用標準SQL。 WITH T條款僅僅爲示例設置了一些數據。

針對您的特殊情況下,你可能會想要一個查詢,如:

SELECT 
    row, 
    issue.updated_at, 
    issue.updated_at - LAG(issue.updated_at) OVER (ORDER BY issue.updated_at) AS timedifference 
FROM `icxmedia-servers.icx_metrics.gh_zh_data_production` 
WHERE issue.number = 6 
    AND issue.name = "archer" 
ORDER BY requestid ASC; 

如果你想確定updated_at外面只是一個單一發行數量的差異,你可以使用一個PARTITION BY條款也是如此。例如:

SELECT 
    row, 
    issue.name, 
    issue.number, 
    issue.updated_at, 
    issue.updated_at - LAG(issue.updated_at) OVER (
     PARTITION BY issue.number 
     ORDER BY issue.updated_at) AS timedifference 
FROM `icxmedia-servers.icx_metrics.gh_zh_data_production` 
ORDER BY requestid ASC; 
+0

我盡力去做等於你的sugestion - AS爲TimeDifference LAG(issue.updated_at)OVER(ORDER BY issue.updated_at) - - issue.updated_at在我的查詢,但是我收到一個錯誤 - 缺少函數在分析表達中的應用。你有沒有正確的可能性? –

+0

請用你想要實現的例子創建一個單獨的問題。 –

+0

我試圖獲得行之間的差異,但值是整數,而不是時間戳。 LAG功能獨自運作良好。但是如果我嘗試做減法,你建議我收到警告 - 分析表達式中的缺失函數。是不同的列和值的同一個問題。 –