2012-01-25 3 views
1

У меня есть данные, которые структурированы следующим образом:Как создать Пробелы недостающих данных

enter image description here

Используя следующий КТР:

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) 

Я создал «Date Set», которые выглядят как это:

enter image description here

Проблема: В исходном наборе данных есть некоторая информация, которая не имеет соответствующей даты в CTE (в приведенном примере 2012-01-24 6:00 в данных нет).

Для этих недостающих точек данных я хотел бы видеть «NULL» в качестве их значения. Я думал, что смогу использовать даты в CTE, которые я создал, но я не уверен, как я могу это сделать.

Я пытался что-то вроде этого, но безуспешно:

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

Ваш запрос выглядит хорошо - вы ничего не предприняли, чтобы упростить это до публикации, не так ли? –

+0

@SteveHomer: Не совсем. В моем наборе данных имеется еще около 7 столбцов, но об этом. –

+0

Любые критерии в поле с правой стороны соединения (myData)? –

ответ

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) 
0

Вы хотите RIGHT OUTER JOIN, а не LEFT OUTER JOIN. Левое соединение имеет нули, где в правой части отсутствуют данные; левая часть здесь myCTE.

+0

К сожалению, это не сработает. Он генерирует NULL для любой даты, присутствующей в наборе данных, но не присутствует в CTE. Я пытаюсь получить обратное: NULL для любой даты в CTE, которая отсутствует в наборе данных. –

+0

@Borealid Проверить еще раз - я думаю, вы неправильно читаете запрос. –

Смежные вопросы