sql - 查找不适合多个定义范围的所有值
问题描述
我有一个包含开始和结束日期列表的表格以及另一个包含一系列日期的表格。我想找出后一张表中的哪些日期不适合前者的日期范围。给定这个例子:
有效日期范围
+----------+------------+------------+
| SensorID | StartDate | EndDate |
+----------+------------+------------+
| 1 | 2018-01-01 | 2018-01-08 |
| 1 | 2018-01-10 | 2018-01-13 |
| 1 | 2018-01-14 | 2018-01-17 |
| 1 | 2018-01-21 | 2018-01-31 |
+----------+------------+------------+
给定日期列表
+----------+------------+-------+
| SensorID | Read_Date | Value |
+----------+------------+-------+
| 1 | 2018-01-01 | 100 |
| 1 | 2018-01-02 | 200 |
| 1 | 2018-01-03 | 300 |
| 1 | 2018-01-09 | 400 |
| 1 | 2018-01-10 | 400 |
| 1 | 2018-01-14 | 250 |
| 1 | 2018-01-18 | 300 |
| 1 | 2018-01-18 | 400 |
| 1 | 2018-01-19 | 350 |
| 1 | 2018-01-24 | 400 |
+----------+------------+-------+
最终结果应该是第二个表的完整记录,即
+----------+------------+-------+
| SensorID | Read_Date | Value |
+----------+------------+-------+
| 1 | 2018-01-09 | 400 |
| 1 | 2018-01-18 | 300 |
| 1 | 2018-01-18 | 400 |
| 1 | 2018-01-19 | 350 |
+----------+------------+-------+
BETWEEN
我考虑过使用完整数据集中的有效记录来查找所有有效记录EXCEPT
,但它太大了。有没有办法加入使用NOT BETWEEN
?
解决方案
我相信它很简单:
SELECT *
FROM given_dates
WHERE NOT EXISTS (
SELECT 1
FROM valid_date_ranges
WHERE given_dates.SensorID = valid_date_ranges.SensorID
AND given_dates.Read_Date BETWEEN StartDate AND EndDate
)
也可以把上面写成LEFT JOIN ... WHERE keycol IS NULL
.
推荐阅读
- javascript - 发送邮件后php成功消息不起作用
- android - 是否可以创建一个应用程序,当您在 Instagram 等社交媒体应用程序中发送短信时触发事件?
- python - 合并具有唯一 ID 计数的列上的数据框
- javascript - 反应钩子。同时从多个孩子更新父状态
- oracle - 为什么 FGA Oracle 会捕获错误?
- flutter - 当光标在其上方时,在 BottomNavigationBarItem 上方正方形(颤动网络)
- javascript - 设备出现少量丢包后,约 30 秒内未发送或接收 WebSocket 消息
- node.js - 切换 NodeJS 模块依赖
- aws-api-gateway - AWS WebSocket API 网关必须对 $connect、$disconnect 和 $default 具有相同的集成?
- javascript - 防止 SweetAlert2 从 willClose 中关闭/解除?