首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL中的Rank()对组进行排序

使用SQL中的Rank()对组进行排序
EN

Stack Overflow用户
提问于 2017-02-21 17:56:50
回答 2查看 5.1K关注 0票数 0

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

代码语言:javascript
复制
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每十年的排名感兴趣。因此,我希望这个查询告诉我,琳达在1940年代排名第二,琳达在20世纪50年代排名第二。然而,在给定的查询中,排名顺序是绝对的,因此琳达在1950年代是第118位(玛丽是1950年代第117位的领导者)。

结果集的片段:

代码语言:javascript
复制
name    namecount Placement Decade

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

如何重新设置排名,使玛丽在20世纪50年代以第1名的身份出现,而琳达以第2名的身份出现,以及如何在随后的每一个十年中以类似的方式重新设置排名?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 18:08:04

米海的回答几乎是正确的。

代码语言:javascript
复制
SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade ORDER BY namecount DESC) as PLACEMENT,
....

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

顺便提一句,这是这篇文章的主要原因,因为order by namecount不是我期望在大多数关系数据库中工作的东西,因为它是聚合本身的结果。因此,数据库支持它对您的情况是很好的,但不要指望它在其他地方。

票数 1
EN

Stack Overflow用户

发布于 2017-02-21 18:02:07

在秩子句中也对其进行分区。

代码语言:javascript
复制
SELECT name, sum(number) as namecount, RANK(name) 
OVER (PARTITION BY decade, name ORDER BY decade, namecount DESC) as PLACEMENT,
....
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42374554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档