首页 > 解决方案 > 查找不适合多个定义范围的所有值

问题描述

我有一个包含开始和结束日期列表的表格以及另一个包含一系列日期的表格。我想找出后一张表中的哪些日期不适合前者的日期范围。给定这个例子:

有效日期范围

+----------+------------+------------+
| 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

标签: sqlsql-serverdate

解决方案


我相信它很简单:

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.


推荐阅读