工作:开始遇到各种数据库的问题,初涉数据库,并不是很了解,可能很多关键的数据库知识没有掌握
现在把我遇到的问题,用简化的形式表达出来。就是求取一连续时间段上出现的数据
构建一个小的表如下,目的是为了求取连续三天出现同一种的天气的数据
CREATE TABLE weather
(
w_status VARCHAR(MAX),
w_date DATETIME
)
INSERT INTO weather(w_status,w_date)VALUES('晴','2017-3-18')
INSERT INTO weather(w_status,w_date)VALUES('晴','2017-3-19')
INSERT INTO weather(w_status,w_date)VALUES('小雨','2017-3-20')
INSERT INTO weather(w_status,w_date)VALUES('小雨','2017-3-21')
INSERT INTO weather(w_status,w_date)VALUES('晴','2017-3-22')
INSERT INTO weather(w_status,w_date)VALUES('小雨','2017-3-23')
INSERT INTO weather(w_status,w_date)VALUES('小雨','2017-3-24')
INSERT INTO weather(w_status,w_date)VALUES('小雨','2017-3-25')
INSERT INTO weather(w_status,w_date)VALUES('阴','2017-3-26')
INSERT INTO weather(w_status,w_date)VALUES('阴','2017-3-27')
因为这个表的数据比较小。所以按照这种小表来进行操作,进行剔除
DELETE FROM weather WHERE w_status IN
(
SELECT A.w_status FROM weather AS A GROUP BY A.w_status HAVING COUNT(*)<3
)
然后只剩下了晴和小雨两种状态,分别构建临时表进行存储,以便后续的操作
create TABLE #TEMP1
(
w_status VARCHAR(MAX),
w_date DATETIME
)
create TABLE #TEMP2
(
w_status VARCHAR(MAX),
w_date DATETIME
)
INSERT INTO #TEMP1
(w_status ,
w_date)SELECT * FROM weather AS A WHERE A.w_status LIKE '%晴%'
INSERT INTO #TEMP2
(w_status ,
w_date)SELECT * FROM weather AS A WHERE A.w_status LIKE '%小雨%'
然后对不同状态的两个临时表进行独立的求取天气连续出现等于三天的数据,看是否有该数据,并得出,该数据出现的起始日期
CREATE TABLE #TEMP3
(w_date DATETIME
)
DECLARE @SD DATETIME
DECLARE @ED DATETIME
SET @SD=(SELECT TOP 1 A.w_date FROM #TEMP1 AS A ORDER BY A.w_date ASC)
SET @ED=(SELECT TOP 1 A.w_date FROM #TEMP1 AS A ORDER BY A.w_date DESC)
DECLARE @MARKDAY DATETIME
WHILE @SD<=@ED
BEGIN
IF EXISTS(SELECT * FROM #TEMP1 AS A WHERE A.w_date BETWEEN @SD
AND DATEADD(DAY,2,@SD) GROUP BY A.w_status HAVING COUNT(*)=3)
BEGIN
SET @MARKDAY=@SD
INSERT INTO #TEMP3 VALUES (@MARKDAY)
SET @SD=DATEADD(DAY,1,@SD)
END
ELSE
SET @SD=DATEADD(DAY,1,@SD)
END
/*******************************************
* 针对不同独立状态求取连续天气状态
*******************************************/
CREATE TABLE #TEMP4
(w_date DATETIME
)
DECLARE @SD1 DATETIME
DECLARE @ED1 DATETIME
SET @SD1=(SELECT TOP 1 A.w_date FROM #TEMP2 AS A ORDER BY A.w_date ASC)
SET @ED1=(SELECT TOP 1 A.w_date FROM #TEMP2 AS A ORDER BY A.w_date DESC)
DECLARE @MARKDAY1 DATETIME
WHILE @SD1<=@ED1
BEGIN
IF EXISTS(SELECT * FROM #TEMP2 AS A WHERE A.w_date BETWEEN @SD1
AND DATEADD(DAY,2,@SD1) GROUP BY A.w_status HAVING COUNT(*)=3)
BEGIN
SET @MARKDAY1=@SD1
INSERT INTO #TEMP4 VALUES (@MARKDAY1)
SET @SD1=DATEADD(DAY,1,@SD1)
END
ELSE
SET @SD1=DATEADD(DAY,1,@SD1)
END
SELECT * FROM #TEMP3
SELECT * FROM #TEMP4
如此,得到了小雨天气,出现了连续三天的情况,
且该状态出现的时间是‘2017-3-23’
但是个人觉得我这样的做法是最愚笨的方法,一步步的去分割解决
博客园上的大神,
求告知连续日期。或者一定规律的比如成日期连续间隔两天的。出现同样的数据状态这种情况
如何正确去利用sql解决。