2017-02-21 259 views
0

下面是一個SQL查詢(在使用他們的演示的數據集之一的谷歌BigQuery的環境,但是這是一個標準的SQL問題):在SQL中使用RANK()排名小組

SELECT name, sum(number) as namecount, RANK(name) 
OVER (ORDER BY decade, namecount DESC) as PLACEMENT, 

case 
when year >= 1940 and year <= 1949 then '40s' 
when year >= 1950 and year <= 1959 then '50s' 
when year >= 1960 and year <= 1969 then '60s' 
when year >= 1970 and year <= 1979 then '70s' 
when year >= 1980 and year <= 1989 then '80s' 
when year >= 1990 and year <= 1999 then '90s' 
when year >= 2000 and year <= 2014 then 'Nowish' 
else 
    'other' 
end as DECADE 

FROM [bigquery-public-data:usa_names.usa_1910_2013] 
where gender = 'F' and year > 1939 
group by decade, name 
having namecount > 25000 
order by decade, namecount DESC 

limit 1000000 

比方說,我有興趣瞭解每個十年琳達的排名。因此,我想查詢告訴我,琳達在二十世紀四十年代排名第二,琳達在二十世紀五十年代排名第二。然而,在給定的查詢中排名順序是絕對的,因此琳達在20世紀50年代是第118位(瑪麗是在1950年代第117位的領導者)。

結果集的一個片段:

name namecount Placement Decade 

Mary 639971  1  40s 
Linda 531587  2  40s 
[ ... ] 
Mary 625464 117  50s 
Linda 564204 118  50s 

如何重置等級,使瑪麗顯示爲#1 20世紀50年代和琳達顯示爲#2,並以類似的重置行列每個後續十年的方式?

+0

SQL Server <>大查詢 –

回答

1

米哈伊的答案是差不多吧。

SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade ORDER BY namecount DESC) as PLACEMENT, 
.... 

我懷疑它會工作,但按分區標準中的列排序是多餘的。

作爲一個側面說明,這是這篇文章的主要原因是,order by namecount是不是我期望在大多數關係數據庫中工作,因爲它是聚合本身的結果。因此,對於您的情況,您的數據庫支持它,但不要指望它在其他地方。

+0

謝謝。這給了我每行1的位置,但它給了我的語法來達到我所需要的,結果是:SELECT name,sum(number)作爲namecount,RANK(name) OVER(PARTITION BY decade order by namecount DESC)作爲PLACEMENT, –

+0

是的,對不起。當然名字不應該是分區標準的一部分。 :-P –

+0

固定它。我仍然感到驚訝的是,SQL Server允許你在窗口中引用聚合:-) –

1

分區也軍銜子句中

SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade, name ORDER BY decade, namecount DESC) as PLACEMENT, 
....