如何获取一个月里连续3天Flag为2的记录。table_06(6月的表格)定义如下:
ID
Flag
Date(日期,仅包含1-31,类型为字符串)

ID Flag Date
232 1   1
232 2   2  
232 1   3
233 4   2
233 2   3
233 3   4
dff 1   7
 希望得到的结果是:ID Count
233 3搜到一个类似的,但这个是Oracle的,我的数据库是Sybase,无法执行。
应该怎样修改呢?或者应该怎样实现?select ID,count(1) from (
select * from  
(select ID,Date,cnt,lag(Date,1,Date-1) over(partition by ID order by rownum) last from table_06)  
where Date=last+1)
group by ID having count(1)>=3

解决方案 »

  1.   

    233只有连续两天吧flag为2吧。lz出错题了
      

  2.   

    ID Flag Date
    232 1 1
    232 2 2   
    232 1 3
    233 4 2
    233 2 3
    233 3 4
    dff 1 7里面没有连续3天flag = 2的阿?
      

  3.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([ID] [nvarchar](10),[Flag] [int],[Date] [int])
    INSERT INTO [tb]
    SELECT '232','1','1' UNION ALL
    SELECT '232','2','2' UNION ALL
    SELECT '232','1','3' UNION ALL
    SELECT '233','4','2' UNION ALL
    SELECT '233','2','3' UNION ALL
    SELECT '233','3','4' UNION ALL
    SELECT 'dff','1','7'
    -->SQL查询如下:SELECT ID, COUNT(1) cnt 
    FROM [tb] t
    WHERE EXISTS(
              SELECT 1 
              FROM tb
              WHERE id = t.id
               AND flag = 2
          )
    AND EXISTS(
            SELECT 1 
            FROM tb
            WHERE id = t.id
             AND (date=t.date+1 OR date=t.date-1)
        )
    GROUP BY ID/*
    ID         cnt
    ---------- -----------
    232        3
    233        3(2 行受影响)
    */
      

  4.   

    -->加个大于等于三天的条件:SELECT ID, COUNT(1) cnt 
    FROM [tb] t
    WHERE EXISTS(
              SELECT 1 
              FROM tb
              WHERE id = t.id
               AND flag = 2
          )
    AND EXISTS(
            SELECT 1 
            FROM tb
            WHERE id = t.id
             AND (date=t.date+1 OR date=t.date-1)
        )
    GROUP BY ID
    HAVING COUNT(1)>=3/*
    ID         cnt
    ---------- -----------
    232        3
    233        3(2 行受影响)
    */
      

  5.   

    --> 测试数据:[TB]
    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([ID] varchar(3),[Flag] int,[Date] int)
    insert [TB]
    select '232',1,1 union all
    select '232',2,2 union all
    select '232',1,3 union all
    select '233',2,2 union all
    select '233',2,3 union all
    select '233',2,4 union all
    select 'dff',1,7select * from [TB]
    ;WITH TT
    AS(
    SELECT id,flag,date, [rowid]=ROW_NUMBER()OVER (PARTITION BY id ORDER BY date) FROM TB WHERE flag = 2)SELECT id,cnt = COUNT(1)
    FROM (
    SELECT * FROM TT WHERE date = rowid+1
    )A
    GROUP BY id HAVING COUNT(1)>=3/*id   cnt
    ---- -----------
    233  3(1 行受影响)*/
      

  6.   

    to  xys_777
    在Sybase开贴了,但等了一天都没人回答,才在这里开贴的。
    to  TheGodOfGods
    是我的失误,233的Flag值应均大于3
      

  7.   

    --ID相同且连续三天或三天以上Flag值大于等于2的ID及数量 
    declare @a table(ID INT, Flag INT, Date INT)
    INSERT @a SELECT 232, 1, 1
    union all select 232 ,2, 2   
    union all select 232 ,1, 3
    union all select 233, 4, 2
    union all select 233, 2, 3
    union all select 233, 3, 4
    union all select 333, 1, 7SELECT id,COUNT(date-o) [COUNT] FROM 
    (
    SELECT * ,o=(SELECT COUNT(1)+1 FROM @a WHERE id=a.id AND date<a.date AND flag>=2)
    FROM @a a 
    WHERE flag>=2
    )aa
    GROUP BY id,date-o
    HAVING COUNT(date-o)>2
    --result
    /*
    id          COUNT       
    ----------- ----------- 
    233         3(所影响的行数为 1 行)*/
      

  8.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([ID] [nvarchar](10),[Flag] [int],[Date] [int])
    INSERT INTO [tb]
    SELECT '232','1','1' UNION ALL
    SELECT '232','2','2' UNION ALL
    SELECT '232','1','3' UNION ALL
    SELECT '233','4','2' UNION ALL
    SELECT '233','2','3' UNION ALL
    SELECT '233','3','4' UNION ALL
    SELECT 'dff','1','7'
    -->SQL查询如下:SELECT ID, COUNT(1) cnt 
    FROM [tb] t
    WHERE EXISTS(
              SELECT 1 
              FROM tb
              WHERE id = t.id
               AND flag >= 3
          )
    AND EXISTS(
            SELECT 1 
            FROM tb
            WHERE id = t.id
             AND (date=t.date+1 OR date=t.date-1)
        )
    GROUP BY ID
    HAVING COUNT(1)>=3/*
    ID         cnt
    ---------- -----------
    233        3(1 行受影响)
    */
      

  9.   

    to htl258AND EXISTS(
                SELECT 1 
                FROM tb
                WHERE id = t.id
                    AND (date=t.date+1 OR date=t.date-1)好像只能保证当前记录前后有一条记录Flag>=3,
    而且我现在要求查询连续10天Flag>=3,好像就不行了呀!!
      

  10.   

    看9楼把count()>2改成count()>9   flag>2 改成flag>3
      

  11.   

    改HAVING的:SELECT ID, COUNT(1) cnt 
    FROM [tb] t
    WHERE EXISTS(
              SELECT 1 
              FROM tb
              WHERE id = t.id
                  AND flag >= 3
          )
        AND EXISTS(
                SELECT 1 
                FROM tb
                WHERE id = t.id
                    AND (date=t.date+1 OR date=t.date-1)
            )
    GROUP BY ID
    HAVING COUNT(1)>=10
      

  12.   

    to htl258
    运行了快一个小时了,可还没出结果??
    好像语句有什么问题呀!!