最近写sql遇到了一点问题,如何查询某一段连续日期的数据,自己写了个很小的数据表,来说明我的思路。希望有高人给更清晰的思路指导

工作:开始遇到各种数据库的问题,初涉数据库,并不是很了解,可能很多关键的数据库知识没有掌握

现在把我遇到的问题,用简化的形式表达出来。就是求取一连续时间段上出现的数据



构建一个小的表如下,目的是为了求取连续三天出现同一种的天气的数据

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<[email protected]
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 @[email protected]
		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<[email protected]
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 @[email protected]
		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解决。

时间: 2024-08-10 19:18:55

最近写sql遇到了一点问题,如何查询某一段连续日期的数据,自己写了个很小的数据表,来说明我的思路。希望有高人给更清晰的思路指导的相关文章

大数据不就是写SQL吗?

[原创,转载请注明出处] 应届生小祖参加了个需求分析会回来后跟我说被产品怼了一句: "不就是写SQL吗,要那么久吗" 我去,欺负我小弟,这我肯定不能忍呀,于是我写了一篇文章发在了公司的wiki 贴出来给大家看看,省略了一些敏感的内容.当然内部版言辞也会温和一点,嘻嘻 在哪里写SQL? 这个问题高级点的问法是用哪种SQL引擎? SparkSQL.Hive.Phoenix.Drill.Impala.Presto.Druid.Kylin (这里的SQL引擎是广义的,大家不必钻牛角尖) 我用一

SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了.我从简单到复杂地写,希望高手们不要见笑.下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了. 从这里下载文件employ

Java开发者写SQL时常犯的10个错误

首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS - Python - Android - Web前端 Java开发者写SQL时常犯的10个错误 2015/03/10 | 分类: 基础技术 | 0 条评论 | 标签: SQL 分享到:0 本文由 ImportNew - zer0Black 翻译自 jooq.欢迎加入翻译小组.转载请见文末要求. 我十分惊讶的

程序员老鸟写sql语句的经验之谈

做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为公司衡量程序员技术水平的标准. 我们程序员不是dba,不需要时刻关注sql运行时间,想方设法优化表结构,存储空间,优化表读取速度等等,但是在开发系统时,时刻保持优良的写sql语句的作风是很有必要的,这关乎到个人在公司的声誉,嘿嘿,你懂的... 新来的程序员老鸟,在一个开发团队中,需要表现一下自己的水

对于sql缓存的一点疑问,以及对未来的展望

对于数据库,我也是个小白 我先举个我遇到的例子吧 一张考勤结果表,这是结果表tm_dayresult id(主键)   psn_num(人员编号)  dutydate(排班日期)  starttime(上班时间) endtime(下班时间)    缺勤时间,旷工时间,早退时间,工作时间,,,,, 客户的情况是:(规定工作时间是08:30-17:30) 客户的需求是,假如我今天加班到20:00之后,第二天9:30以后打卡才算迟到 我接手的情况是:没有源代码,不能改源代码(用友标准产品,不允许修改)

像写SQL一样编写Java数据应用-TinySqlDsl

前言话说企业应用,一般离不开数据库.要做数据库,可以有N种方案,比如:直接采用JDBC层自己封装下使用的,采用一些框架的,如:iBatis,Hiberate,Spring JDBC Template等等(这个太多了,因此不一一列举)的,这些方案也都在各自的领域展示了自己的特点,解决了相当部分的技术问题,并取得了相当好的应用效果. 但是不管是哪种方案,其优点和缺点往往也是连在一起的,究其原因是因为SQL和Java编程之间是割裂的,如果封装得不到位,做Java的人太难使用:如果封装得太多,在做一些用

discuz 7.2 faq.php sql注入的一点研究

6.2号(可能更早)看到网上这个exp,是一个discuz 7.2的sql注射漏洞 经过多番考证,网上多数exp中都存在这些或者那些的问题,我自己利用和修改后总结,利用方法如下: Discuz 7.2 /faq.php SQL注入漏洞 1.获取数据库版本信息 faq.php?action=grouppermission&gids[99]='&gids[100][0]=) and (select 1 from (select count(*),concat(version(),floor(r

mybatis中写sql语句时需要转义的字符

mybatis配置文件,sql语句中含有转义字符: 错误语句: select * from table_base where flag_topic  & #{topic_num} 错误信息: Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 54; The entity name must immediately follow the '&' in the entity reference. 正确语

真正的SqlHelper,让程序写Sql也那么美

真正的SqlHelper,让程序写Sql也那么美 在程序里写Sql语句是程序员经常干的事,一串长长的字符串完全由键盘敲写,容易出错.且效率低,开发工具的智能提示无法检测出编写的Sql字符串是否有错误. 如果有个工具可以让写Sql像写程序一样便捷,这个样子: 你是否想尝试一下呢? 第一步:使用NuGet包管理器引用Rc.PetaPoco.T4 安装成功后,项目里多出Models文件夹,文件夹里包含T4模板文件. 在web.config或者app.config里配置连接字符串,配置完成后将字符串的名