【问题标题】:Return only the newest rows from a BigQuery table with a duplicate items仅返回 BigQuery 表中包含重复项的最新行
【发布时间】:2016-03-13 21:59:47
【问题描述】:

我有一个包含许多重复项的表 - 许多行具有相同的 id,可能唯一的区别是 requested_at 列。

我想从表中创建一个select *,但只返回一个具有相同id 的行——最近请求的。

我已经查看了group by id,但是我需要对每一列进行聚合。 requested_at - max(requested_at) as requested_at 很容易做到这一点 - 但其他人很难。

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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

    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,设置目标表,并指定不展平结果(如果您有包含重复字段的架构)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        相关资源
        最近更新 更多