簡體   English   中英

使用Bigquery(標准SQL)獲取每組分組結果的前n條記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM