2017-06-21 83 views
0

我見過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這確實存在,但我無法解決如何重新啓動每個組的號碼。

回答

2

這是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資源的話)。

1

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

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