首页 > 解决方案 > 根据两个条件获取 BigQuery 中每个 user_id 的最新行

问题描述

我有一个包含 3 个重要列的 Bigquery 表:

user_id, created_at, updated_at.

每个都user_id可以有多个记录,例如:

+----------+------------+-------------+-----------------+
| user_id  | created_at | updated_at  |    task_name    |
+----------+------------+-------------+-----------------+
| user_1   | 2020-01-01 | 2020-01-02  | some_task_name1 |
| user_1   | 2020-01-01 | 2020-01-03  | some_task_name1 |
| user_1   | 2020-03-01 | 2020-03-01  | some_task_name1 |
| user_2   | 2020-01-01 | 2020-01-02  | some_task_name2 |
+----------+------------+-------------+-----------------+

对于每个user_id具有相同created_at值的记录,我想选择最新的记录updated_at。例如,在这个例子中,输出必须是:

    +----------+------------+-------------+-----------------+
    | user_id  | created_at | updated_at  |    task_name    |
    +----------+------------+-------------+-----------------+
    | user_1   | 2020-01-01 | 2020-01-03  | some_task_name1 |
    | user_1   | 2020-03-01 | 2020-03-01  | some_task_name1 |
    | user_2   | 2020-01-01 | 2020-01-02  | some_task_name2 |
    +----------+------------+-------------+-----------------+

我正在尝试这个,但我不知道如何添加相同的条件created_at

SELECT
  agg.table.*
FROM (
  SELECT
    user_id,
    ARRAY_AGG(STRUCT(table)
    ORDER BY
      updated_at DESC)[SAFE_OFFSET(0)] agg
  FROM
    `dataset.my_table` table
  GROUP BY
    user_id)

标签: google-cloud-platformgoogle-bigquery

解决方案


考虑以下方法

select as value array_agg(t order by updated_at desc limit 1)[offset(0)]
from `project.dataset.table` t
group by user_id, created_at        

如果应用于您问题中的样本数据 - 输出是

在此处输入图像描述


推荐阅读