2015-02-24 1 views
0

У меня есть обновляемая таблица последовательности значений даты (скажем dbo.sequence) в SQL Server 2014. Даты уникальны.T-SQL CTE self-reference CROSS APPLY предыдущая строка по дате с пробелами

Когда появляются новые обновления, я хочу распространять эти значения в разных столбцах в отдельной таблице (например, dbo.distributed_values) с помощью определенных условий, например. если предыдущее значение от dbo.sequence меньше/больше текущего значения dbo.sequence, оно вставляется в указанный столбец dbo.distributed_values или становится NULL в этой колонке.

Вот основная идея:

;WITH 
CTE_tbl (date, value, val_1, val_2, val_3) 
AS (
SELECT ... FROM dbo.distributed_values -- get latest values from database 

UNION ALL 

SELECT 
    SEQ.date, 
    SEQ.value, 

    CASE 
    WHEN ABS (SEQ.value - prev.value) >= 0.5 
    THEN SEQ.value 
    ELSE NULL 
    END AS val_1, 

    ... 

    FROM dbo.sequence AS SEQ 
    CROSS APPLY (SELECT * FROM CTE_tbl WHERE date = DATEADD(DAY, -1, SEQ.date)) AS prev 
) 

INSERT INTO dbo.distributed_values (...) 
SELECT * 
    FROM CTE_tbl 
    ORDER BY date ASC 
    OPTION (MAXRECURSION 1000) 

Кажется, он работает в основном, но dbo.sequence содержит пробелы, поэтому я не могу использовать такие вещи, как date = DATEADD(DAY, -1, SEQ.date) связать на предыдущей строке должным образом.

2012-01-04 
2012-01-05 
2012-01-06 
2012-01-09 
2012-01-10 
2012-01-11 

Как правильно привязать предыдущее значение в случае недостатков даты?

UPD: Кстати, я не могу использовать LAG ... OVER в статье WHERE, я пробовал. Может ли это как-то использоваться здесь?

+0

селектов выглядит довольно сложное, но вы проверили LAG? Возможно, это помогает: https://msdn.microsoft.com/en-us/library/hh231256.aspx –

ответ

1

Добавить еще КТР и использовать его в вашем рекурсивном CTE, что-то вроде этого:

;WITH 
SequenceWithPrevious AS(
    SELECT * 
     ,PrevValue = LAG(value,1,NULL) OVER (ORDER BY SEQ.date) 
     ,Prevdate = LAG(date,1,NULL) OVER (ORDER BY SEQ.date) 
    FROM dbo.sequence AS SEQ 
), 
CTE_tbl (date, value, val_1, val_2, val_3) 
AS (
SELECT ... FROM dbo.distributed_values -- get latest values from database 

UNION ALL 

SELECT ... 
    FROM SequenceWithPrevious AS SEQ 
    CROSS APPLY (SELECT * FROM CTE_tbl WHERE date = SEQ.PrevDate) AS prev 
) 

INSERT INTO dbo.distributed_values (...) 
SELECT * 
    FROM CTE_tbl 
    ORDER BY date ASC 
    OPTION (MAXRECURSION 1000) 

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

  • Нет связанных вопросов^_^