SQL Server Rank() 按组
Posted
技术标签:
【中文标题】SQL Server Rank() 按组【英文标题】:SQL Server Rank() by group 【发布时间】:2012-07-17 08:04:09 【问题描述】:我有一个这样的数据表:
Employee1 Product1 ProductGroup1 Quantity SalesDate
Employee1 Product1 ProductGroup1 Quantity SalesDate
Employee1 Product2 ProductGroup1 Quantity SalesDate
Employee1 Product2 ProductGroup1 Quantity SalesDate
Employee2 Product1 ProductGroup1 Quantity SalesDate
Employee2 Product1 ProductGroup1 Quantity SalesDate
Employee2 Product1 ProductGroup1 Quantity SalesDate
Employee2 Product1 ProductGroup1 Quantity SalesDate
Employee2 Product2 ProductGroup1 Quantity SalesDate
Employee2 Product2 ProductGroup1 Quantity SalesDate
有多个员工、多个产品、多个产品组、多个销售日期。在报告服务中,我有一个矩阵,其中父组是员工,子组是产品,列组是销售日期。我需要对产品进行排名,以便获得前 5 个并将其他产品放在其他列表中。
问题是,我必须在员工组内对产品进行排名,并且产品可以有多个销售日期,而我需要评估所有内容。
现在在 SQL 中我有:Rank() Over (partition by DataTable.ProductGroup1, DataTable.Employee Order by Sum(Quantity) desc) as Rank
但这给了我错误的结果,因为相同的产品具有不同的排名值,因为排名函数使用不同销售日期的数量进行排名。我应该如何编写 sql,所以它返回所有销售日期的数据,使用所有日期总和的数量的巴士排名?
编辑: 一些数据集来解释我得到什么以及我需要什么。
//DATA I HAVE
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col
Employee1 Product1 ProductGroup1 100 2012-01
Employee1 Product1 ProductGroup1 200 2012-02
Employee1 Product2 ProductGroup1 50 2012-01
Employee1 Product2 ProductGroup1 80 2012-02
Employee2 Product1 ProductGroup1 200 2012-01
Employee2 Product1 ProductGroup1 70 2012-02
Employee2 Product2 ProductGroup1 20 2012-01
Employee2 Product2 ProductGroup1 450 2012-02
//RESULT I GET
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col Rank_col
Employee1 Product1 ProductGroup1 100 2012-01 2
Employee1 Product1 ProductGroup1 200 2012-02 1
Employee1 Product2 ProductGroup1 50 2012-01 4
Employee1 Product2 ProductGroup1 80 2012-02 3
Employee2 Product1 ProductGroup1 200 2012-01 2
Employee2 Product1 ProductGroup1 70 2012-02 3
Employee2 Product2 ProductGroup1 20 2012-01 4
Employee2 Product2 ProductGroup1 450 2012-02 1
//RESULT I NEED
Employee_col Product_col ProductGroup_col Quantity_col SalesDate_col Rank_col
Employee1 Product1 ProductGroup1 100 2012-01 1
Employee1 Product1 ProductGroup1 200 2012-02 1
Employee1 Product2 ProductGroup1 50 2012-01 2
Employee1 Product2 ProductGroup1 80 2012-02 2
Employee2 Product1 ProductGroup1 200 2012-01 2
Employee2 Product1 ProductGroup1 70 2012-02 2
Employee2 Product2 ProductGroup1 20 2012-01 1
Employee2 Product2 ProductGroup1 450 2012-02 1
【问题讨论】:
您能否提供示例数据、不正确的查询输出(您尝试过的内容)以及预期的查询输出?我很难追上你。 排名要做,产品方面还是产品组方面? @JNM 由于问题不清楚,您很可能不会得到答案。您能否提供具体示例、示例输入和预期输出,以便我们提供帮助。 我通过计算临时表中的排名并将其加入原始数据来获得必要的结果。我不会把我的解决方案写成好的答案,因为也许有人会提出更好的方法。 【参考方案1】:试试这个查询
select
#t.*, salesrank
from #t
inner join
(
select Employee, Product, RANK() over (partition by employee order by sq desc) as salesrank
from
(select Employee, Product , SUM (Quantity) sq from #t group by Employee, product) v
) v
on #t.product = v.product
and #t.Employee =v.Employee
【讨论】:
这与我所做的几乎相同。我想没有更好的解决方案。【参考方案2】:RANK() over (Employee_col, Product_col, SalesDate_col order by Quantity_col ASC 分区)
【讨论】:
您是否阅读了 OP 关于 rank() 尝试的内容?如果是,您应该详细说明并解释为什么您的答案是好的。 这是 PARTITION BY 的绝佳使用!以上是关于SQL Server Rank() 按组的主要内容,如果未能解决你的问题,请参考以下文章