给出部分数据
2005-12-22 1
2006-01-04 0
2006-01-06 0
2006-01-07 0
2006-01-11 0
2006-01-17 0
2006-01-21 0
2006-01-23 0
2006-01-24 0
2006-01-26 1
2006-01-30 1
2006-02-02 1
2006-02-06 0
2006-02-07 0
2006-02-13 1
2006-02-27 0
2006-03-02 1
2006-03-09 1
2006-03-14 1
2006-03-27 1
2006-04-01 1
上面数据按时间升序排列,求连续出现0或1最多的次数,并且把对应的起始时间和结束保存起来
如,对上面数据求连续1,应该得出结果:
2006-3-2,2006-4-1,5(5个连续1)

解决方案 »

  1.   

    DECLARE @tb TABLE(date DATETIME,pn int)
    INSERT @tb 
    SELECT      '2005-12-22', 1
    UNION SELECT '2006-01-04', 0
    UNION SELECT '2006-01-06', 0
    UNION SELECT '2006-01-07' ,0
    UNION SELECT '2006-01-11' ,0
    UNION SELECT '2006-01-17' ,0
    UNION SELECT '2006-01-21' ,0
    UNION SELECT '2006-01-23' ,0
    UNION SELECT '2006-01-24' ,0
    UNION SELECT '2006-01-26' ,1
    UNION SELECT '2006-01-30' ,1
    UNION SELECT '2006-02-02' ,1
    UNION SELECT '2006-02-06' ,0
    UNION SELECT '2006-02-07' ,0
    UNION SELECT '2006-02-13' ,1 
    UNION SELECT '2006-02-27' ,0
    UNION SELECT '2006-03-02' ,1
    UNION SELECT '2006-03-09' ,1
    UNION SELECT '2006-03-14' ,1
    UNION SELECT '2006-03-27' ,1
    UNION SELECT '2006-04-01' ,1SELECT date,pn,IDENTITY(INT) id INTO #tb FROM @tb
    SELECT id,pn,date,hasBefore=(SELECT COUNT(1) FROM #tb b WHERE b.pn=a.pn AND b.id=a.id-1) INTO #base FROM #tb a
    SELECT pn,newDate= CONVERT(CHAR(10),MIN(date),120)+','+ CONVERT(CHAR(10),MAX(date),120)
    FROM (
    SELECT pn,date,far=(
    CASE hasBefore 
    WHEN 0 THEN id
    ELSE (SELECT MAX(x.id) FROM #base x WHERE x.pn=b.pn AND x.id<b.id AND x.hasBefore=0)
    END
    )
    FROM #base b) base
    GROUP BY pn,far
    DROP TABLE #tb
    DROP TABLE #base结果数据:
    1 2005-12-22,2005-12-22
    0 2006-01-04,2006-01-24
    1 2006-01-26,2006-02-02
    0 2006-02-06,2006-02-07
    1 2006-02-13,2006-02-13
    0 2006-02-27,2006-02-27
    1 2006-03-02,2006-04-01
      

  2.   

    e,有点问题,看错了,以为第一个列是放具体值的.原来是放记录数.
    我装记录数放在日期后面了.写法如下.DECLARE @tb TABLE(date DATETIME,pn int)
    INSERT @tb 
    SELECT      '2005-12-22', 1
    UNION SELECT '2006-01-04', 0
    UNION SELECT '2006-01-06', 0
    UNION SELECT '2006-01-07' ,0
    UNION SELECT '2006-01-11' ,0
    UNION SELECT '2006-01-17' ,0
    UNION SELECT '2006-01-21' ,0
    UNION SELECT '2006-01-23' ,0
    UNION SELECT '2006-01-24' ,0
    UNION SELECT '2006-01-26' ,1
    UNION SELECT '2006-01-30' ,1
    UNION SELECT '2006-02-02' ,1
    UNION SELECT '2006-02-06' ,0
    UNION SELECT '2006-02-07' ,0
    UNION SELECT '2006-02-13' ,1 
    UNION SELECT '2006-02-27' ,0
    UNION SELECT '2006-03-02' ,1
    UNION SELECT '2006-03-09' ,1
    UNION SELECT '2006-03-14' ,1
    UNION SELECT '2006-03-27' ,1
    UNION SELECT '2006-04-01' ,1SELECT date,pn,IDENTITY(INT) id INTO #tb FROM @tb
    SELECT id,pn,date,hasBefore=(SELECT COUNT(1) FROM #tb b WHERE b.pn=a.pn AND b.id=a.id-1) INTO #base FROM #tb aSELECT pn,newDate= CONVERT(CHAR(10),MIN(xdate),120)+','+ CONVERT(CHAR(10),MAX(xdate),120)+','+RTRIM(
    (SELECT COUNT(n.id) FROM #base n 
    WHERE n.date>=MIN(base.xdate) 
    AND n.date<=MAX(base.xdate) 
    AND n.pn=base.pn
    )
    )
    FROM (
    SELECT pn,date as xdate,far=(
    CASE hasBefore 
    WHEN 0 THEN id
    ELSE (SELECT MAX(x.id) FROM #base x WHERE x.pn=b.pn AND x.id<b.id AND x.hasBefore=0)
    END
    )
    FROM #base b) base
    GROUP BY pn,far
    DROP TABLE #tb
    DROP TABLE #base结果数据1 2005-12-22,2005-12-22,1
    0 2006-01-04,2006-01-24,8
    1 2006-01-26,2006-02-02,3
    0 2006-02-06,2006-02-07,2
    1 2006-02-13,2006-02-13,1
    0 2006-02-27,2006-02-27,1
    1 2006-03-02,2006-04-01,5