[英]Get top n records for each group of grouped results with Bigquery (standard SQL)
我已經看到了這個問題 ,這幾乎就是我想要的。 但我無法使用標准SQL來使用Bigquery,因為BQ不允許用戶定義的變量。
注意 - 我有任意數量的組,因此根據鏈接問題中的第一個答案對所有組進行UNION
是不可行的。
以下是最簡單的示例,盡管任何解決方案都應該能夠擴展到需要的n個頂級結果:
給出如下表格,包括人,組和年齡列,您如何獲得每組中最老的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`;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.