使用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`;