假设有一张考勤单,经常需要将连续或重叠的时间段合并。在做简单查询时这可能成为问题,所以要当心,这个问题并不容易领会或理解:
CREATE TABLE Timesheets
(task_id CHAR(10) NOT NULL PRIMARY KEY,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
CHECK(start_date <= end_date));
INSERT INTO Timesheets
VALUES (1, '1997-01-01', '1997-01-03'),
(2, '1997-01-02', '1997-01-04'),
(3, '1997-01-04', '1997-01-05'),
(4, '1997-01-06', '1997-01-09'),
(5, '1997-01-09', '1997-01-09'),
(6, '1997-01-09', '1997-01-09'),
(7, '1997-01-12', '1997-01-15'),
(8, '1997-01-13', '1997-01-14'),
(9, '1997-01-14', '1997-01-14'),
(10, '1997-01-17', '1997-01-17');
解惑 #1
SELECT T1.start_date, MAX(T2.end_date)
FROM Timesheets AS T1, Timesheets AS T2
WHERE T1.start_date <= T2.end_date
AND NOT EXISTS
(SELECT *
FROM Timesheets AS T3, Timesheets AS T4
WHERE T3.end_date < T4.start_date
AND T3.start_date >= T1.start_date
AND T3.end_date <= T2.end_date
AND T4.start_date >= T1.start_date
AND T4.end_date <= T2.end_date
AND NOT EXISTS
(SELECT *
FROM Timesheets AS T5
WHERE T5.start_date BETWEEN T3.start_date AND T3.end_date
AND T5.end_date BETWEEN T4.start_date AND T4.end_date))
GROUP BY T1.start_date
HAVING T1.start_date = MIN(t2.start_date);
结果
start_date end date
======================
1997-01-01 1997-01-05
1997-01-06 1997-01-09
1997-01-12 1997-01-15
1997-01-17 1997-01-17
结果
start_date end date
======================
1997-01-01 1997-01-05
1997-01-06 1997-01-09
1997-01-12 1997-01-15
1997-01-17 1997-01-17
解惑 #2
这个查询很长,但是检查一下查询时间。
SELECT X.start_date, MIN(Y.end_date) AS end_date
FROM (SELECT T1.start_date
FROM Timesheets AS T1
LEFT OUTER JOIN
Timesheets AS T2
ON T1.start_date > T2.start_date
AND T1.start_date <= T2.end_date
GROUP BY T1.start_date
HAVING COUNT(T2.start_date) = 0) AS X(start_date)
INNER JOIN
(SELECT T3.end_date
FROM Timesheets AS T3
LEFT OUTER JOIN
Timesheets AS T4
ON T3.end_date >= T4.start_date
AND T3.end_date < T4.end_date
GROUP BY T3.end_date
HAVING COUNT(T4.start_date) = 0) AS Y(end_date)
ON X.start_date <= Y.end_date
GROUP BY X.start_date;
结果
start_date end date
=======================
1997-01-01 1997-01-05
1997-01-06 1997-01-09
1997-01-12 1997-01-15
1997-01-17 1997-01-17
结果
start_date end date
=======================
1997-01-01 1997-01-05
1997-01-06 1997-01-09
1997-01-12 1997-01-15
1997-01-17 1997-01-17
解惑 #3
SELECT X.start_date, MIN(X.end_date) AS end_date
FROM (SELECT T1.start_date, T2.end_date
FROM Timesheets AS T1, Timesheets AS T2, Timesheets AS T3
WHERE T1.end_date <= T2.end_date
GROUP BY T1.start_date, T2.end_date
HAVING MAX (CASE
WHEN (T1.start_date > T3.start_date
AND T1.start_date <= T3.end_date)
OR (T2.end_date >= T3.start_date
AND T2.end_date < T3.end_date)
THEN 1 ELSE 0 END) = 0) AS X
GROUP BY X.start_date;
结果
start_date end_date
========================
1997-01-01 1997-01-05
1997-01-06 1997-01-09
1997-01-12 1997-01-15
1997-01-17 1997-01-17
这个小小的查询中包含了很多逻辑。
分享到:
相关推荐
SQL语句备忘手册是一本全面涵盖SQL基本到高级操作的手册,对于SQL学习者和开发者来说,这是一份非常实用的参考资料。手册分为多个部分,详细介绍了SQL的各种语句和函数,帮助用户掌握数据库管理和数据操作的核心技能...
本备忘单是针对SQL注入的学习和利用资源,涵盖了各种注入技巧和防御策略。 1. **SQL注入基本原理**: SQL注入发生时,用户输入的数据未经验证或过滤就直接被用作数据库查询的一部分,导致执行非预期的SQL命令。...
根据提供的标题、描述以及部分文本内容,我们可以总结出以下关于SQL语句的重要知识点: ### SQL基础知识 #### 创建数据库(Create Database) 创建一个新的数据库是管理数据的第一步。在SQL中,可以使用`CREATE ...
【个人备忘录】是一款简易的备忘录应用程序,它提供了基本的记录、保存和查看功能,方便用户在日常生活中管理待办事项、记事或提醒。这款应用的亮点在于其简洁的界面和易于操作的设计,使用户可以快速上手并有效管理...
KNIME 的按条件汇聚节点可以按照指定列为条件对其他列进行汇聚操作,类似于 SQL 中的 GroupBy。 7. 重命名列节点 KNIME 的重命名列节点可以重命名列名,对 GroupBy 后的新列进行重命名或者对数据类型进行调整。 8...
数据库是存储和管理数据的核心工具,SQL(Structured Query Language)是用于操作数据库的语言,包括创建、查询、更新和删除数据等操作。以下是一份全面的SQL知识点概览,旨在帮助你理解和掌握数据库语句的使用。 1...
SQL,全称Structured Query Language,是用于管理和处理关系数据库的标准编程语言。在本文中,我们将深入探讨几个关于SQL的小常识,这些知识对于数据库管理和开发人员来说是十分实用的。 首先,`@@ROWCOUNT` 是一个...
【标题解析】:“sajib-cheatsheet”很可能是一个个人创建的备忘单或速查表,由用户“sajib”制作,用于记录和整理各种技术知识点或操作指南。这个标题表明这是一个集中的资源,可能包含编程语言、操作系统命令、...
新程序员备忘单是针对初入编程领域者的实用指南,旨在帮助他们解决在学习和实践过程中可能遇到的各种问题。这份备忘单包含了多种关键知识点,旨在提升编程技能、理解编程概念以及有效地解决问题。 1. **基础语法与...
在数据库版本控制中,备忘录模式可以帮助我们记录数据库在不同时间点的结构和数据,使得我们能够回滚到先前的状态,就像在文件系统中使用SVN(Subversion)一样进行版本提交、修改和恢复。 在Java中,实现数据库...
- **.pjx .pjt**:分别为项目文件和项目备忘录文件的扩展名。 - **Public**:定义全局变量的关键字。 - **Local**:定义局部变量的关键字。 - **Save to mVar all like C***:将所有以C开头的变量保存到mVar变量中。...
【标题解析】: "cheatsheets" 这个标题表明这是一个关于备忘单或速查表的资源集合,其中包含了作者自己编写的PDF文档和屏幕截图。这些备忘单通常用于快速查阅各种IT技术或概念的关键信息,帮助用户在实际工作中提高...
2. MyBatis:熟悉SQL映射文件,动态SQL,事务管理等功能。 3. MVC模式:了解Web开发中的Model-View-Controller架构。 以上只是《Java面试宝典--牛客网》中的一部分核心知识点,实际内容可能还包括数据库操作、Web...
14. 数据定义查询不属于 SQL 查询,因为 SQL 主要用于数据查询、更新和删除等操作,而数据定义通常涉及创建表、视图等数据库对象,因此 `D.操作查询` 是正确答案。 15. Java 中定义类的关键字是 `class`。 16. ...
其次,`SQLite语法备忘录.doc`文档提供了SQLite SQL语言的基本语法规则。SQL是Structured Query Language的缩写,用于创建、查询、更新和管理关系数据库。在SQLite中,你可以学习到如何创建数据库、表,插入、更新和...
AtCorderChecker ...存储初始化sql、开发备忘录等。 crawler : 爬虫程序的目录。 用 Ruby 开发。 at-corder-checker :发布在 Web 上的目录。在真实服务器上,在这里放一个符号链接。 使用 PHP、HTML/CSS、JavaS
在这个场景下,"CheatSheet"可能是一个关于对象命令实用程序和"索梅尔"(可能是指Sommelier,一个与数据库管理或数据查询相关的工具,但具体含义未明,因为标签中没有提供更多信息)的备忘单。由于标签为空,我们...
功能非常强大,内部已具有缓存机制,以空间换取时间的方式,用户群同时访问可以支持最大限度,还有功能可兼容一切流行浏览器,扩容性强,功能模块:执行模式、办公模式、运营模式、决策 模式、知识中心;待编辑完成后...