2016-09-20 68 views
0

我有一張正在增長的記錄表,我希望能夠修改記錄。但是,我希望能夠對每條記錄的所有「最新」版本(最高modified_date +唯一primary_key)有一個邏輯視圖。我對GROUP BYprimary_key的表格嘗試了JOIN,但這要求整個表格有ORDER BYmodified_date,這超過了資源。如何根據BigQuery中的特定列去重複記錄?

回答

1

您可以通過指定PARTITION BY來避免資源爆炸,然後允許在更細粒度的級別上進行排序。這種模式足夠:

SELECT 
    * 
FROM (
    SELECT 
    *, 
    ROW_NUMBER() OVER(PARTITION BY primary_key ORDER BY modified_date DESC) seq 
    FROM 
    my_table) 
WHERE 
    seq = 1; 
+0

除此之外,我沒有更好的立即建議。與重複數據刪除不同,另一種考慮問題的方式是,您希望與特定組的最大值關聯的行(由主鍵確定)。語法可能是這樣的:MAX(primary_key RETURNING )。如果您有興趣,我提交了https://code.google.com/p/google-bigquery/issues/detail?id=706。謝謝! –

0

現在有一個更好的方法來做到這一點。下面是一個例子:

WITH T AS (
    SELECT x, y, MOD(y, 2) AS z 
    FROM UNNEST([5, 4, 3, 2]) AS x WITH OFFSET y 
) 
SELECT 
    z, 
    ARRAY_AGG(x ORDER BY y LIMIT 1)[OFFSET(0)] AS top_x 
FROM T 
GROUP BY z; 

這將返回由一些其它列確定的,由第三列分組的頂部x值。另一個答案中的查詢可以表示爲:

WITH my_table AS (
    SELECT 1 AS primary_key, "foo" AS value, DATE('2016-11-09') AS modified_date UNION ALL 
    SELECT 1, "bar", DATE('2016-11-10') UNION ALL 
    SELECT 2, "baz", DATE('2016-01-01') 
) 
SELECT 
    row.* 
FROM (
    SELECT 
    ARRAY_AGG(t ORDER BY modified_date DESC LIMIT 1)[OFFSET(0)] AS row 
    FROM my_table AS t 
    GROUP BY primary_key 
); 

這將返回與最近的modified_date關聯的行。理論上,您應該能夠在[OFFSET(0)]之後直接使用.*(並且不需要子選擇符),但是我正在研究的列解析似乎存在一個錯誤。