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

解决方案 »

  1.   

    select *,
          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
      

  2.   

    select *,
          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
      

  3.   

    我更悲剧,也看不懂楼主ssp2009发的,不知道啥意思
      

  4.   

    不知道ssp2009能不能解释解释下,好让我们学的明白点
      

  5.   

    刚测试了下,按照SSP2009的方法,不能得到需要的结果
    比如李四这条,26号的李四就没有计算出flag=1
      

  6.   

    ssp2009 的思路是
    首先这个是个自连接
    查询每条语句的同时去查与当前记录相同名称的数据 
    并且日期要大于当前这边记录的日期 
    并算出是否大于8天
      

  7.   

    select *,
          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
      

  8.   

    这个自连接学会了,也看明白了,特别感谢小F的解释不过通过这个方法还是未能得出我需要的结果刚测试了下,按照SSP2009的方法,不能得到需要的结果
    比如李四这条,26号的李四就没有计算出flag=1
      

  9.   


    --> 测试数据: [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 行受影响)
      

  10.   

    思路,分两步:
    1.
    union all后面的指:同个name最后一天的记录肯定flag=1,因为之后不在有记录,固8天之内肯定不会再出现2.union all前面的指:同个name相隔一天大于等于8天则flag=1,这样是不包含最后1天的,固需要补上
      

  11.   

    geniuswjt请教下,这个是什么意思
    select rid=ROW_NUMBER() over (PARTITION by Name order by Date desc),* from tb1是先分配行号么?
      

  12.   

    你单独执行下这句看看效果
    然后再百度下row_number()函数的用法
    再结合给出的语句,应该就可以理解了.
    其实就是分组排序.