我有一个简单的 bigquery 表,包含 3 列(和一些示例数据),如下:
|---------------------|------------------|------------|
| Name | Time | Value |
|---------------------|------------------|------------|
| a | 1 | x |
|---------------------|------------------|------------|
| a | 2 | y |
|---------------------|------------------|------------|
| a | 3 | z |
|---------------------|------------------|------------|
| b | 1 | x |
|---------------------|------------------|------------|
| b | 4 | y |
|---------------------|------------------|------------|
Run Code Online (Sandbox Code Playgroud)
对于每个名称,我想返回最长时间的值。
对于上表,应返回第 3 行和第 5 行,例如,
|---------------------|------------------|------------|
| Name | Time | Value |
|---------------------|------------------|------------|
| a | 3 | z |
|---------------------|------------------|------------|
| b | 4 | y |
|---------------------|------------------|------------|
Run Code Online (Sandbox Code Playgroud)
大致如下:(1)首先按名称分组,(2)找出每组中的最大时间,(3)识别具有最大时间的行。
似乎对于(1)和(2),我们可以使用 group by + max(),但我不确定如何实现(3)步骤。
任何人都知道我可以编写实现此目的的最佳查询是什么。
多谢。
Tim*_*sen 17
ROW_NUMBER一种方法是去这里:
SELECT Name, Time, Value
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Time DESC) rn
FROM yourTable
) t
WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)
使用QUALIFY我们可以尝试:
SELECT Name, Time, Value
FROM yourTable
WHERE TRUE
QUALIFY ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Time DESC) = 1;
Run Code Online (Sandbox Code Playgroud)
以下是 BigQuery 标准 SQL
#standardSQL
SELECT AS VALUE ARRAY_AGG(t ORDER BY time DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
是否适用于您的问题中的示例数据,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'a' name, 1 time, 'x' value UNION ALL
SELECT 'a', 2, 'y' UNION ALL
SELECT 'a', 3, 'z' UNION ALL
SELECT 'b', 1, 'x' UNION ALL
SELECT 'b', 4, 'y'
)
SELECT AS VALUE ARRAY_AGG(t ORDER BY time DESC LIMIT 1)[OFFSET(0)]
FROM `project.dataset.table` t
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
结果是
Row name time value
1 a 3 z
2 b 4 y
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15453 次 |
| 最近记录: |