如何返回具有最大值的 BigQuery 表行

SZZ*_*SZZ 11 google-bigquery

我有一个简单的 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)


Mik*_*ant 6

以下是 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)