SQL - 一起使用dense_rank和group by

Posted

技术标签:

【中文标题】SQL - 一起使用dense_rank和group by【英文标题】:SQL - Use dense_rank and group by together 【发布时间】:2020-04-19 02:55:10 【问题描述】:

我的印象是当我们使用rank/row_number/dense_rank时,我们不能使用group by,但是为什么下面的逻辑运行成功

Select product, type, dense_rank() over (partition by type order by sum(sales) desc) as rnk 
From mytable 
Where date> dateadd(month, -3, getdate()) 
Group by product, type

为什么我可以在排名函数中按 sum(sales) 排序?

谢谢

【问题讨论】:

【参考方案1】:

您的查询基本上相当于:

select pt.*,
       dense_rank() over (partition by type order by total_sales desc) as rnk 
from (select product, type, sum(sales) as total_sales
      from mytable 
      where date > dateadd(month, -3, getdate()) 
      group by product, type
     ) pt;

也就是说,dense_rank()GROUP BY 之后执行

这是完全允许的。因此,您对这些不能一起使用的理解是不正确的。但是,有一些限制。 dense_rank() 中的引用必须是在GROUP BY 之后 已知的列或表达式。

所以,这在您的版本中是允许的:

dense_rank() over (partition by type order by sum(sales) desc) as rnk 

但这不是:

dense_rank() over (partition by type order by sales desc) as rnk 

因为sales(单独)在group by 之后无效。

【讨论】:

【参考方案2】:

您在 select 语句中使用的所有列,它包含在聚合函数或 group by 子句中。

我们可以在同一个查询集中使用 rank 函数和 group by,但所有列都应该包含在聚合函数或 Group by 子句中。

因此,此查询集通过对产品和类型进行分组来给出结果,并根据销售额从最高到最低给出排名,因为您在 Order by 子句中使用了降序。

【讨论】:

以上是关于SQL - 一起使用dense_rank和group by的主要内容,如果未能解决你的问题,请参考以下文章

sql MS SQL数据聚合 - RANK和DENSE_RANK

over在SQL里就啥意思

在 SQL Server 中使用 Dense_Rank 对具有排名的列进行排名组合

SQL SERVER 的窗体函数OVER的使用:row_number/rank/dense_rank

SQL SERVER 的窗体函数OVER的使用:row_number/rank/dense_rank

T-SQL“dense_rank”,每个等级的最大行数