当前位置: 代码迷 >> Sql Server >> 查询日前连续3天销量为0的日期
  详细解决方案

查询日前连续3天销量为0的日期

热度:66   发布时间:2016-04-24 09:20:39.0
查询最近连续3天销量为0的日期。
序号 日期 销量
1 2015/2/20 7
2 2015/2/21 7
3 2015/2/22 7
4 2015/2/23 7
5 2015/2/24 0
6 2015/2/25 7
7 2015/2/26 7
8 2015/2/27 0
9 2015/2/28 0
10 2015/3/1 0
11 2015/3/2 7
12 2015/3/3 7

希望能查询出的结果是
2015/2/27
2015/2/28
2015/3/1

谢谢大家,元宵节快过了,也要快乐!
------解决思路----------------------

drop table mytable 
go
create table mytable (id int , cdate datetime , num int )
go
insert into  mytable
values( 1, '2015/2/20' ,7) ,
(2 ,'2015/2/21' ,7),
(3 ,'2015/2/22' ,7),
(4 ,'2015/2/23' ,7),
(5 ,'2015/2/24' ,0),
(6 ,'2015/2/25' ,7),
(7 ,'2015/2/26' ,7),
(8 ,'2015/2/27' ,0),
(9 ,'2015/2/28' ,0),
(10 ,'2015/3/1' ,0),
(11 ,'2015/3/2' ,7),
(12 ,'2015/3/3' ,7)
go
with mt as (
select * , cdate + ROW_NUMBER() over(order by id desc) add_date
from mytable where num = 0 
)
select id , cdate , num from mt 
where add_date in (select add_date from mt group by add_date having COUNT(*) >=3)
go


(12 行受影响)
id          cdate                   num
----------- ----------------------- -----------
10          2015-03-01 00:00:00.000 0
9           2015-02-28 00:00:00.000 0
8           2015-02-27 00:00:00.000 0

(3 行受影响)



------解决思路----------------------
;WITH CTE AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY 日期)RN1
FROM mytable
)
,CTE2 AS(
SELECT *,ROW_NUMBER()OVER(ORDER BY 日期)RN2
FROM CTE
WHERE 销量=0
)
,CTE3 AS(
SELECT *,COUNT(1)OVER(PARTITION BY RN1-RN2)C
FROM CTE2
)
SELECT 序号,日期 FROM CTE3
WHERE C=3
  相关解决方案