使用Bigquery(标准SQL)获取每组分组结果的前n条记录

问题描述:

我见过this question,这几乎就是我想要的。但是我无法使用标准SQL在Bigquery上工作,因为BQ不允许用户定义变量。使用Bigquery(标准SQL)获取每组分组结果的前n条记录

注意 - 我有一个任意数量的组,所以UNION所有他们根据链接问题的第一个答案是不可行的。

下面是一个最简单的例子,但任何解决方案 应该能够扩展到然而,许多■首页结果需要:

给定一个表像之下,与个人,群体和年龄列, 你将如何得到每个组中的2个最老的人? ( 集团内部的关系应该在任何 为了不产生更多的成果,但给第2)

+--------+-------+-----+ 
| Person | Group | Age | 
+--------+-------+-----+ 
| Bob | 1  | 32 | 
| Jill | 1  | 34 | 
| Shawn | 1  | 42 | 
| Jake | 2  | 29 | 
| Paul | 2  | 36 | 
| Laura | 2  | 39 | 
+--------+-------+-----+ 

所需的结果集:

+--------+-------+-----+ 
| Shawn | 1  | 42 | 
| Jill | 1  | 34 | 
| Laura | 2  | 39 | 
| Paul | 2  | 36 | 
+--------+-------+-----+ 

一个答案中的链接问题提到使用ROW_NUMBER这确实存在,但我无法解决如何重新启动每个组的号码。

这是row_number()

select t.* 
from (select t.*, 
      row_number() over (partition by group order by age desc) as seqnum 
     from t 
    ) t 
where seqnum <= 2; 

row_number()是ANSI标准窗口函数。它在大多数数据库中都可用。总的来说,我建议你更注重使用Postgres而不是MySQL来解决BQ中的问题(如果你自己找不到BQ资源的话)。

您可以使用带有限制的ARRAY_AGG。例如,

#standardSQL 
SELECT 
    `Group`, 
    ARRAY_AGG(STRUCT(Person, Age) 
      ORDER BY Age DESC LIMIT 2) AS oldest_people 
FROM People 
GROUP BY `Group`;