我有一张正在增长的记录表,我希望能够将修改后的记录附加到其中。但是,我希望能够对所有"最新的"每条记录的版本(最高modified_date
+唯一primary_key
)。我使用JOIN
GROUP BY
对表格primary_key
进行了尝试,但这需要整个表格ORDER BY
modified_date
,这超出了资源。
答案 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)]
(并且不需要子选择),但是我正在研究列分辨率的错误。