标签:insert bsp sel 方法 日期 pre tab des having
工作:开始遇到各种数据库的问题,初涉数据库,并不是很了解,可能很多关键的数据库知识没有掌握
现在把我遇到的问题,用简化的形式表达出来。就是求取一连续时间段上出现的数据
构建一个小的表如下,目的是为了求取连续三天出现同一种的天气的数据
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解决。
最近写sql遇到了一点问题,如何查询某一段连续日期的数据,自己写了个很小的数据表,来说明我的思路。希望有高人给更清晰的思路指导
标签:insert bsp sel 方法 日期 pre tab des having
原文地址:http://www.cnblogs.com/zhangbaoc/p/6623536.html