添加排名字段并返回标准的前3个数据库

时间:2015-02-06 18:35:14

标签: sql sql-server sql-server-2008

感谢您查看我的问题。

我希望它能够返回排名,并根据“日期”,“组”,“销售计数”进行排名,因此它可以给出前3的排名。例如,2014年1月1日约翰在“BIGGroup1A”中因此,产品10中的等级为1,产品7中的等级为2.在2014年1月1日的同一天,他在两个不同的组中出售55和55,因此它们都应该是1.我填写了其余的排名与我追求的逻辑相匹配。

mytable是

Date    Name    Group          ProductName  SellCount
1/2/2014    John    BigGroup1A  Product7    10
1/2/2014    John    BigGroup1A  Product10   100
1/2/2014    John    BigGroup1B  Product2    55
1/2/2014    John    Group1A         Product1    55
1/3/2014    John    Group1B         Product6    5
1/3/2014    John    Group1C         Product9    44
1/3/2014    John    Group1C         Product4    55
1/3/2014    John    LargeGroup1A    Product5    77
1/4/2014    John    LargeGroup2A    Product8    25
1/5/2014    John    LargeGroup2B    Product12   660
1/6/2014    John    MediumGroup2A   Product11   50
1/7/2014    John    MediumGroup2A   Product3    55

我希望结果是:

Date    Name    Group          ProductName  SellCount   Rank
1/2/2014    John    BigGroup1A  Product7    10           2
1/2/2014    John    BigGroup1A  Product10   100          1
1/2/2014    John    BigGroup1B  Product2    55           1
1/2/2014    John    Group1A         Product1    55           1
1/3/2014    John    Group1B         Product6    5            1
1/3/2014    John    Group1C         Product9    44           2
1/3/2014    John    Group1C         Product4    55           1
1/3/2014    John    LargeGroup1A    Product5    77           1
1/4/2014    John    LargeGroup2A    Product8    25           1
1/5/2014    John    LargeGroup2B    Product12   660          1
1/6/2014    John    MediumGroup2A   Product11   50           1
1/7/2014    John    MediumGroup2A   Product3    55           1

我很欣赏sql中的解决方案,我是新手,希望每个人都可以提供帮助。

2 个答案:

答案 0 :(得分:1)

您应该可以使用rank()窗口函数,如下所示:

select * from (
  select 
    *,
    rank = rank() over (partition by date, [group] order by date, [group], sellcount desc)
  from table1
) t 
where rank <= 3

内部查询根据您的规范为每行分配排名,并使用排名&gt;的外部查询过滤器行。 3。

有关示例,请参阅this SQL Fiddle

答案 1 :(得分:0)

您可以使用RANK()来实现您的目标。

Select *, 
RANK() OVER (PARTITION BY DATE,GROUP ORDER BY SELLCOUNT)AS RANK 
from Table T

PARTITION BY将结果集划分为基于DATEGROUP.ORDER BY的组,确保排名基于创建的组中的SELLCOUNT