如何根据BigQuery中的特定列重复删除记录?

时间:2016-09-20 23:16:50

标签: google-bigquery

我有一张正在增长的记录表,我希望能够将修改后的记录附加到其中。但是,我希望能够对所有"最新的"每条记录的版本(最高modified_date +唯一primary_key)。我使用JOIN GROUP BY对表格primary_key进行了尝试,但这需要整个表格ORDER BY modified_date,这超出了资源。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)](并且不需要子选择),但是我正在研究列分辨率的错误。