Как создать пропуски для отсутствующих данных - PullRequest
1 голос
/ 25 января 2012

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

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)

Я создал «Набор дат», который выглядит следующим образом:

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;

Ответы [ 2 ]

1 голос
/ 25 января 2012

Я не могу воспроизвести проблему, которую вы видите.Я создал запрос ниже и проверил его, и он отлично работает - можете ли вы проверить это в вашей среде?

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 голосов
/ 25 января 2012

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

...