tb1
Name Date
张三 2011/9/10
李四 2011/9/18
李四 2011/9/17
王五 2011/9/13
李四 2011/9/26
李四 2011/9/10
如何获得以下查询结果
Flag Name Date
1 张三 2011/9/10
1 李四 2011/9/18
0 李四 2011/9/17
1 王五 2011/9/13
1 李四 2011/9/26
0 李四 2011/9/10
条件:每个Name判断8天之内是否重复出现,不包括第8天,如果被出现则0,新出现的继续往后判断8天之内是否有出现,8天之内没有再次出现相同的Name,那么则为1,以此类推上面的例子,李四出现了4次,
Flag Name Date
0 李四 2011/9/10
0 李四 2011/9/17
1 李四 2011/9/18
1 李四 2011/9/26
Flag=(case when datediff(day,a.date,(select top 1 date from tb
where name=a.name date>a.date)>8 then 1 else 0 end)
from tb a
Flag=(case when datediff(day,a.date,(select top 1 date from tb
where name=a.name date>a.date order by date))>8 then 1 else 0 end)
from tb a
比如李四这条,26号的李四就没有计算出flag=1
首先这个是个自连接
查询每条语句的同时去查与当前记录相同名称的数据
并且日期要大于当前这边记录的日期
并算出是否大于8天
Flag=(
case when ---这里懂吧。。
datediff(day,a.date, ---这里是datediff函数 用于天数的加减
(select top 1 date from tb where name=a.name date>a.date)---判断每个名字所在的最大日期
>8 --大于8的话 加1 否则不加
then 1 else 0 end)
from
tb a
比如李四这条,26号的李四就没有计算出flag=1
--> 测试数据: [tb1]
if object_id('[tb1]') is not null drop table [tb1]
create table [tb1] (Name varchar(4),Date datetime)
insert into [tb1]
select '张三','2011/9/10' union all
select '李四','2011/9/18' union all
select '李四','2011/9/17' union all
select '王五','2011/9/13' union all
select '李四','2011/9/26' union all
select '李四','2011/9/10'--开始查询
;with cte as(
select rid=ROW_NUMBER() over (PARTITION by Name order by Date desc),* from tb1
)
select a.Name,a.Date,Flag=(case when datediff(day,a.date,b.date)>=8 then 1 else 0 end)
from cte a join cte b on (a.Name=b.Name and a.rid=b.rid+1)
union all
select Name,Date,1 from cte where rid=1
order by 1,2--结束查询
drop table [tb1]/*
Name Date Flag
---- ----------------------- -----------
李四 2011-09-10 00:00:00.000 0
李四 2011-09-17 00:00:00.000 0
李四 2011-09-18 00:00:00.000 1
李四 2011-09-26 00:00:00.000 1
王五 2011-09-13 00:00:00.000 1
张三 2011-09-10 00:00:00.000 1(6 行受影响)
1.
union all后面的指:同个name最后一天的记录肯定flag=1,因为之后不在有记录,固8天之内肯定不会再出现2.union all前面的指:同个name相隔一天大于等于8天则flag=1,这样是不包含最后1天的,固需要补上
select rid=ROW_NUMBER() over (PARTITION by Name order by Date desc),* from tb1是先分配行号么?
然后再百度下row_number()函数的用法
再结合给出的语句,应该就可以理解了.
其实就是分组排序.