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() 按组的主要内容,如果未能解决你的问题,请参考以下文章

在具有重复行的 SQL Server 表中按组查找行号

SQL Server - 找到最高计数后按组排序

Pandas按组内的值分组和排序[重复]

SQL 按组排序

按组进行 SQL UPDATE

SQL:过去 30 天的滚动总和(按组)