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
在 SQL Server 中使用 Dense_Rank 对具有排名的列进行排名组合
SQL SERVER 的窗体函数OVER的使用:row_number/rank/dense_rank