给出部分数据
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)
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)
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
我装记录数放在日期后面了.写法如下.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