2017-10-11 57 views
1

我目前正試圖計算谷歌大查詢中的行之間的差異。我實際上有一個工作查詢。谷歌大查詢中的行之間的差異

SELECT 
    id, record_time, level, lag, 
    (level - lag) as diff 
FROM (
    SELECT 
     id, record_time, level, 
     LAG(level) OVER (ORDER BY id, record_time) as lag 
    FROM (
     SELECT 
     * 
     FROM 
     TABLE_QUERY(MY_TABLES)) 
    ORDER BY 
     1, 2 ASC 
    ) 
GROUP BY 1, 2, 3, 4 
ORDER BY 1, 2 ASC 

但我使用大數據,有時我有內存限制警告,不讓我執行查詢。所以,我想了解爲什麼我不能做像波紋管這樣的優化查詢。我認爲這將允許在沒有內存限制警告的情況下處理更多記錄。

SELECT 
     id, record_time, level, 
     level - LAG(level, 1) OVER (ORDER BY id, record_time) as diff 
    FROM (
     SELECT 
     * 
     FROM 
     TABLE_QUERY(MY_TABLES)) 
    ORDER BY 
     1, 2 ASC 

這種功能level - LAG(level, 1) OVER (ORDER BY id, record_time) as diff,當執行查詢返回的錯誤

在解析表達式

大上查詢中缺少的功能。

我也試着把()放到這個函數中,但是它不起作用。

感謝您的幫助!

+0

另外我覺得你有一個尾部逗號在'末尾('和'失蹤')'末尾。 –

+0

你的問題中的第一個查詢根本沒有意義。通常無意義的東西失敗!所以試圖改進它也沒有多大意義。我建議你寧願解釋你的第一個查詢所要達到的目標,所以我們將幫助你解決這個問題 –

+0

從'我有內存限制警告,不讓我執行查詢' - 只刪除ORDER BY語句! –

回答

0

它適合我。也許你忘了enable standard SQL?這裏是一個例子:

WITH Input AS (
    SELECT 1 AS id, TIMESTAMP '2017-10-17 00:00:00' AS record_time, 2 AS level UNION ALL 
    SELECT 2, TIMESTAMP '2017-10-16 00:00:00', 3 UNION ALL 
    SELECT 1, TIMESTAMP '2017-10-16 00:00:00', 4 
) 
SELECT 
id, record_time, level, lag, 
(level - lag) as diff 
FROM (
    SELECT 
    id, record_time, level, 
    LAG(level) OVER (ORDER BY id, record_time) as lag 
    FROM Input 
) 
GROUP BY 1, 2, 3, 4 
ORDER BY 1, 2 ASC; 
+0

我沒有啓用標準的SQL。我無法做到這一點,因爲我的查詢的另一大部分工作在傳統SQL上。我必須訪問許多不允許通過標準SQL輕鬆訪問的視圖。我認爲這種減法在傳統模式下是可能的。 –

+0

我不認爲你可以使用複雜的表達式和使用舊版SQL的OVER子句。您需要使用標準SQL或在子查詢中執行分析函數計算。 –

+0

我工作查詢的第7行中的OVER子句的LAG函數在傳統模式下工作得非常好。所以,我試圖優化查詢,正如我在我的問題中解釋的那樣,但是在我的問題的第二個查詢中的減法中,它不適用於傳統模式。 –