Sql server SQL-我想选择每周销售额前5名

Sql server SQL-我想选择每周销售额前5名,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在努力找到一个迄今为止已经发布的答案。在SQLServer2008中,我尝试着每周销售前5名。例如,将读取 01/01/2014 | 50 | Item1 01/01/2014 | 40 | Item2 01/01/2014 | 30 | Item3 01/01/2014 | 20 | Item4 01/01/2014 | 10 | Item5 01/01/2014 | 5 | Item6 01/01/2014 | 2 | Item7 08/01/2014 | 50 | Item4 08/

我正在努力找到一个迄今为止已经发布的答案。在SQLServer2008中,我尝试着每周销售前5名。例如,将读取

01/01/2014 | 50 | Item1
01/01/2014 | 40 | Item2
01/01/2014 | 30 | Item3
01/01/2014 | 20 | Item4
01/01/2014 | 10 | Item5
01/01/2014 | 5 | Item6
01/01/2014 | 2 | Item7

08/01/2014 | 50 | Item4
08/01/2014 | 40 | Item3
08/01/2014 | 30 | Item2
08/01/2014 | 20 | Item1
08/01/2014 | 10 | Item5
08/01/2014 | 5 | Item7
08/01/2014 | 2 | Item6
只会回来

01/01/2014 | 50 | Item1
01/01/2014 | 40 | Item2
01/01/2014 | 30 | Item3
01/01/2014 | 20 | Item4
01/01/2014 | 10 | Item5
08/01/2014 | 50 | Item4
08/01/2014 | 40 | Item3
08/01/2014 | 30 | Item2
08/01/2014 | 20 | Item1
08/01/2014 | 10 | Item5
目前,我的代码返回所有数据集中的前5名,似乎忽略了周因素

非常感谢您的帮助

**编辑道歉我的当前代码导致我

2014年1月1日| 50 |项目1 2014年1月8日| 50 |第4项 2014年1月1日| 40 |项目2 2014年1月8日| 40 |第3项 2014年1月1日| 30 |第3项

我将在下面给出一些建议,你可以用它从日期中提取一周,然后用它来获得每周前五名

您没有提供列名,因此我将它们称为item_date、item_score和item_name:

注: 前五名有点模棱两可。我的解决方案会发现每周得分前五名的项目,而不管项目数量如何。如果您严格要求不超过五个项目,您必须找到另一个订单来处理重复分数的项目,例如,如果一周内有六个项目的最高分数,您会怎么做?。无论如何,在这种情况下,您应该使用而不是排名。

您可以使用从日期中提取一周,然后使用获取每周前五名

您没有提供列名,因此我将它们称为item_date、item_score和item_name:

注:
前五名有点模棱两可。我的解决方案会发现每周得分前五名的项目,而不管项目数量如何。如果您严格要求不超过五个项目,您必须找到另一个订单来处理重复分数的项目,例如,如果一周内有六个项目的最高分数,您会怎么做?。在任何情况下,在这种情况下,您都应该使用而不是排名。

的可能重复项,但您返回的输出每周已排名前5位。您是否可以共享您的预期结果样本可能重复项,但您返回的输出每周已排名前5位。您是否可以共享您的预期结果样本
SELECT item_date, item_score, item_name
FROM   (SELECT *, 
               RANK() OVER (PARTITION BY DATEPART(WEEK, item_date) 
                            ORDER BY item_score DESC) AS rk
        FROM   my_table) t
WHERE  rk <= 5
declare @tab table
(
[month] date,
CustomerCode int,
ITEM varchar(20) 
)
insert into @tab
select
'01/01/2014',50 ,'Item1'
 union all 
select
'01/01/2014',40,'Item2' union all
select 
'01/01/2014',30,'Item3' union all
select 
'01/01/2014',20,'Item4' union all 
select 
'01/01/2014',10,'Item4' union all
select
'08/01/2014',50,'Item1' union all
select 
'08/01/2014',40,'Item2' union all
select 
'08/01/2014',30,'Item3' union all 
select
'08/01/2014',40,'Item4' union all
select 
'08/01/2014',10,'Item4' 

;with cte as 
(
 select DENSE_RANK() OVER(partition by  
 datepart(day, datediff(day, 0, [month])/7 * 7)/7 + 1 ORDER BY DatePart(wk, [month])) AS RN,* from @tab
),
 CTE2 AS
(
select *,ROW_NUMBER()OVER(PARTITION BY RN ORDER BY (SELECT NULL))R from cte
)

Select [month],CustomerCode,ITEM from CTE2
WHERE R < 4