如何为丢失的数据生成差距

时间:2012-01-25 15:21:43

标签: sql join left-join gaps-and-islands

我的数据结构如下:

enter image description here

使用以下CTE:

WITH DateRange AS
(
SELECT CAST('2012-01-24 06:00' AS DATETIME) DateValue
UNION ALL
SELECT DATEADD(mi, 1, DateValue)
FROM    DateRange   
WHERE   DATEADD(mi, 1, DateValue) <= '2012-01-24 12:00'
)
SELECT DateValue FROM DateRange
OPTION (MAXRECURSION 0)

我创建了一个&#34;日期集&#34;看起来像这样:

enter image description here

问题是:原始数据集中有一些数据在CTE中没有相应的日期(在提供的示例中,2012-01-24 6:00不是存在于数据中)。

对于这些缺失的数据点,我希望看到&#34; NULL&#34;作为他们的价值。我以为我可以利用我生成的CTE中的日期,但我不确定如何做到这一点。

我尝试过这样的事情但没有成功:

SELECT C.DateValue, D.Value 
FROM myCTE C 
LEFT OUTER JOIN myData D ON C.DateValue = D.Date
ORDER BY C.DateValue ASC;

2 个答案:

答案 0 :(得分:1)

我无法复制你所看到的问题。我在下面创建了查询并对其进行了测试,它运行正常 - 您可以在您的环境中测试吗?

Declare @var as Table (DateValue datetime)

Insert Into @var (DateValue) Values ('2012-01-24 06:01:00.000')
Insert Into @var (DateValue) Values ('2012-01-24 06:02:00.000')
Insert Into @var (DateValue) Values ('2012-01-24 06:03:00.000')

;WITH DateRange AS ( 
    SELECT CAST('2012-01-24 06:00' AS DATETIME) DateValue 
    UNION ALL 
    SELECT DATEADD(mi, 1, DateValue) 
    FROM    DateRange    
    WHERE   DATEADD(mi, 1, DateValue) <= '2012-01-24 12:00' 
) 

SELECT dr.DateValue, v.DateValue
FROM DateRange dr
        Left Outer Join @var v On dr.DateValue = v.DateValue
Order By v.DateValue
OPTION (MAXRECURSION 0) 

答案 1 :(得分:0)

您需要RIGHT OUTER JOIN,而不是LEFT OUTER JOIN。左连接有空值,右侧缺少数据;这里的左侧是myCTE