【问题标题】:Using Rank() in SQL to rank groups在 SQL 中使用 Rank() 对组进行排名
【发布时间】:2017-02-21 17:56:50
【问题描述】:

这是一个 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 年代排名第二。然而,在给定的查询中排名顺序是绝对的,因此 Linda 在 1950 年代排在第 118 位(玛丽在 1950 年代排在第 117 位)。

结果集的一个sn-p:

name    namecount Placement Decade

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

如何重置排名,让 Mary 在 1950 年代显示为 #1,Linda 显示为 #2,并在随后的每个十年中以类似的方式重置排名?

【问题讨论】:

  • SQL Server 大查询

标签: sql google-bigquery rank


【解决方案1】:

米海的回答几乎是对的。

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

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

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

【讨论】:

  • 谢谢。这给了我每行 1 的 Placement,但它给了我达到我需要的语法,结果是:SELECT name, sum(number) as namecount, RANK(name) OVER (PARTITION BY十年顺序按名称计数 DESC)作为 PLACEMENT,
  • 是的,对不起。当然 name 不应该是分区标准的一部分。 :-P
  • 修复了它。我仍然对 SQL Server 允许您在窗口中引用聚合感到惊讶 :-)
  • 我猜引用聚合是“旧版 SQL”的细微差别,我在 Google BigQuery 环境中运行的几乎是 SQL。
【解决方案2】:

在 RANK 子句中也进行分区

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

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 2019-05-03
    • 2012-04-19
    • 2016-08-16
    • 2017-07-21
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多