在 SQL 中使用 Rank() 对组进行排名

Using Rank() in SQL to rank groups

这是一个 SQL 查询(在 Google BigQuery 环境中使用他们的演示数据集之一,但这是一个标准 SQL 问题):

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 

假设我想知道 Linda 每个十年的排名。因此,我希望查询告诉我 Linda 在 1940 年代排名第二,Linda 在 1950 年代排名第二。然而,在给定的查询中排名顺序是绝对的,因此琳达在 1950 年代排在第 118 位(玛丽在 1950 年代排在第 117 位)。

结果集片段:

name    namecount Placement Decade

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

如何重置排名,使玛丽在 1950 年代显示为第一名,琳达显示为第二名,并在随后的每个十年中以类似的方式重置排名?

也在 RANK 子句中对其进行分区

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

米海的回答几乎是对的

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

我怀疑它会起作用,但在您的分区标准中按列排序是多余的。

作为旁注,post 的主要原因是 order by namecount 不是我期望在大多数关系数据库中工作的东西,因为它是一个结果聚合自身。因此,您的数据库支持它对您的情况很好,但不要指望其他地方。