2015-12-08 65 views
5

我有一个包含许多重复项目的表 - 许多行具有相同的id,可能唯一的区别是requested_at列。仅返回BigQuery表中具有重复项目的最新行

我想从表格中做一个select *,但只返回与最近请求的id相同的一行。

我已经调查过group by id但我需要为每列做一个聚合。这很容易与requested_at - max(requested_at) as requested_at - 但其他人是艰难的。

我如何确保我得到title等与最近更新的行对应的值?

回答

7

我建议类似的形式避免了窗口函数排序:

SELECT * 
    FROM (
     SELECT 
      *, 
      MAX(<timestamp_column>) 
       OVER (PARTITION BY <id_column>) 
       AS max_timestamp, 
     FROM <table> 
    ) 
    WHERE <timestamp_column> = max_timestamp 
2

尝试这样:

SELECT * 
    FROM (
     SELECT 
      *, 
      ROW_NUMBER() 
       OVER (
        PARTITION BY <id_column> 
        ORDER BY <timestamp column> DESC) 
       row_number, 
     FROM <table> 
    ) 
    WHERE row_number = 1 

注意它会加入row_number列,你可能不希望。要解决这个问题,您可以在外部select语句中按名称选择各个列。

就你而言,这听起来像requested_at列是你想要在ORDER BY中使用的列。

而且,您还希望使用allow_large_results,设置目标表,并指定不展平结果(如果您的模式具有重复字段)。