SQL Server:在缺少数据的日期范围之间选择数据

时间:2016-06-13 10:17:37

标签: sql-server

使用SQL Server 2012,我有一个脚本,每天将4行数据插入表中。数据如下所示:

Complete Data

有时,由于源数据不完整,因此未插入一行或多行。这看起来像这样 - 第二列称为commodityID

Missing Data

有时可能会丢失多行。

我正在尝试编写一个查询,告诉我哪些数据缺失,因此对于上面的示例,它将是commodityID = 2。我有另一个表,它是一个日历(列出所有日期)表,我使用下面的查询来查看所有商品的给定日期是否没有数据。

SELECT *
FROM [Calendar] 
WHERE (NOT EXISTS (SELECT ID, CommodityID, Price, DateEntered
                   FROM Spectron_DailyPricing
                   WHERE (CONVERT(date, DateEntered) = Calendar.date))) 
                     AND (date BETWEEN '2015-05-14' AND dateadd(day, -1,GETDATE()))
ORDER BY date asc

我希望能够运行一个SQL查询,该查询将查看所有数据并显示日期和缺少的commodityID。因此,对于上面的示例,它将显示以下内容。

example result

由于我的数据跨越了几年,并且存在奇怪的缺失行,因此会有很多结果。

1 个答案:

答案 0 :(得分:2)

WITH
    CTE_Numbers AS (
        SELECT * FROM (VALUES (1),(2),(3),(4)) AS a(CommodityID)),
    CTE_Calendar AS (
        SELECT *
        FROM [Calendar] c
        CROSS JOIN CTE_Numbers n
        WHERE c.date BETWEEN '2015-05-14' AND dateadd(day, -1,GETDATE()))
SELECT *
FROM CTE_Calendar c
LEFT JOIN Spectron_DailyPricing s
    ON c.CommodityID = s.CommodityID
    AND c.date = CONVERT(date, s.DateEntered)
WHERE 
    s.CommodityID IS NULL
ORDER BY c.date asc