Google bigquery 如何在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

更改数据捕获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 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分钟。分区和集群并没有帮助,因为要创建完整的行,我们需要读取完整的表。我们是否需要执行任何解决方案来改进查询执行?