Google bigquery 如何在BigQuery中获取每个列级别的最新值
更改数据捕获CDC记录不会具有记录中列的所有值。对于记录的主键(比如ID),我们可能有ID=1且带有Load\ U时间戳的CDC记录。 例如,如果记录R1具有列Col1、Col2、Col3、Col4、Load\u Timestamp CDC的记录将被删除 是否可以在bigquery中获得如下输出Google bigquery 如何在BigQuery中获取每个列级别的最新值,google-bigquery,Google Bigquery,更改数据捕获CDC记录不会具有记录中列的所有值。对于记录的主键(比如ID),我们可能有ID=1且带有Load\ U时间戳的CDC记录。 例如,如果记录R1具有列Col1、Col2、Col3、Col4、Load\u Timestamp CDC的记录将被删除 是否可以在bigquery中获得如下输出 下面是BigQuery标准SQL #standardSQL SELECT id, ARRAY_AGG(COL1 IGNORE NULLS ORDER BY Load_Timestamp DESC
下面是BigQuery标准SQL
#standardSQL
SELECT id,
ARRAY_AGG(COL1 IGNORE NULLS ORDER BY Load_Timestamp DESC LIMIT 1)[OFFSET(0)] AS COL1,
ARRAY_AGG(COL2 IGNORE NULLS ORDER BY Load_Timestamp DESC LIMIT 1)[OFFSET(0)] AS COL2,
ARRAY_AGG(COL3 IGNORE NULLS ORDER BY Load_Timestamp DESC LIMIT 1)[OFFSET(0)] AS COL3,
ARRAY_AGG(COL4 IGNORE NULLS ORDER BY Load_Timestamp DESC LIMIT 1)[OFFSET(0)] AS COL4,
MAX(Load_Timestamp) AS Load_Timestamp
FROM `project.dataset.table`
GROUP BY id
或者,您可以使用UDF重构上面的内容,如下面的示例所示
#standardSQL
CREATE TEMP FUNCTION LATEST_VALUE(arr ARRAY<STRUCT<el STRING, ts TIMESTAMP>>) AS ((
SELECT el
FROM UNNEST(arr)
WHERE NOT el IS NULL
ORDER BY ts DESC
LIMIT 1
));
SELECT id,
LATEST_VALUE(ARRAY_AGG(STRUCT(COL1, Load_Timestamp))) AS COL1,
LATEST_VALUE(ARRAY_AGG(STRUCT(COL2, Load_Timestamp))) AS COL2,
LATEST_VALUE(ARRAY_AGG(STRUCT(COL3, Load_Timestamp))) AS COL3,
LATEST_VALUE(ARRAY_AGG(STRUCT(COL4, Load_Timestamp))) AS COL4,
MAX(Load_Timestamp) AS Load_Timestamp
FROM `project.dataset.table`
GROUP BY id
对大小为1.4TB/2265683330记录的表运行查询时。查询执行时间超过27分钟。分区和集群并没有帮助,因为要创建完整的行,我们需要读取完整的表。我们是否需要执行任何解决方案来改进查询执行?