У меня есть обновляемая таблица последовательности значений даты (скажем 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
, я пробовал. Может ли это как-то использоваться здесь?
селектов выглядит довольно сложное, но вы проверили LAG? Возможно, это помогает: https://msdn.microsoft.com/en-us/library/hh231256.aspx –