在 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
不是我期望在大多数关系数据库中工作的东西,因为它是一个结果聚合自身。因此,您的数据库支持它对您的情况很好,但不要指望其他地方。
这是一个 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
不是我期望在大多数关系数据库中工作的东西,因为它是一个结果聚合自身。因此,您的数据库支持它对您的情况很好,但不要指望其他地方。