Sql server SQL-我想选择每周销售额前5名
我正在努力找到一个迄今为止已经发布的答案。在SQLServer2008中,我尝试着每周销售前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/
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