【发布时间】:2023-04-02 02:29:02
【问题描述】:
根据using ARRAY_AGG() to obtain the latest record 的 BigQuery 最佳做法,我将按照以下方式获取字段一天的第一个、最后一个最小值和最大值。数据大约每小时报告一次。
WITH t AS (
SELECT TIMESTAMP('2021-01-01 01:00:00') as l, 10 as v
UNION ALL
SELECT TIMESTAMP('2021-01-01 02:00:00') as l, 12 as v
UNION ALL
SELECT TIMESTAMP('2021-01-01 03:00:00') as l, 15 as v
UNION ALL
SELECT TIMESTAMP('2021-01-01 04:00:00') as l, 2 as v
UNION ALL
SELECT TIMESTAMP('2021-01-02 01:00:00') as l, 600 as v
UNION ALL
SELECT TIMESTAMP('2021-01-02 02:00:00') as l, 120 as v
UNION ALL
SELECT TIMESTAMP('2021-01-02 03:00:00') as l, 150 as v
UNION ALL
SELECT TIMESTAMP('2021-01-03 04:00:00') as l, 0 as v)
SELECT EXTRACT(DATE FROM l) d,
ARRAY_AGG(t.v ORDER BY t.l ASC LIMIT 1)[OFFSET(0)] first_value,
ARRAY_AGG(t.v ORDER BY t.l DESC LIMIT 1)[OFFSET(0)] last_value,
ARRAY_AGG(t.v ORDER BY t.v DESC LIMIT 1)[OFFSET(0)] max_value,
ARRAY_AGG(t.v ORDER BY t.v ASC LIMIT 1)[OFFSET(0)] min_value,
FROM
t
GROUP BY
d
输出:
| Row | d | max_value | min_value | last_value | first_value |
|---|---|---|---|---|---|
| 1 | 2021-01-01 | 15 | 2 | 2 | 10 |
| 2 | 2021-01-02 | 600 | 120 | 150 | 600 |
| 3 | 2021-01-03 | 0 | 0 | 0 | 0 |
由于代码审查中只有六个 BigQuery 问题,我想我会在 Stack Overflow 上提问。这是最快的方法吗?我的查询中有什么无关的吗? (我不太确定 [OFFSET(0)] 是否在做任何事情。)
我在 Stack Overflow for Oracle、T-SQL 和 Postgres 上看到过这个问题,但我没有看到任何特定于 BigQuery 的内容。谢谢!
【问题讨论】:
标签: group-by google-bigquery array-agg