2017-02-11 1 views
2

Я использую SQL Oracle и пытаюсь выяснить, на основе ниже набора данных, как я могу обновить строку 3, когда условие выполнено в строке 1?SQL - изменить значение на Строке 3, если условие условия выполнено на Строке 1

Правило: Если Check = Y, то «На второй месяц после, Glidepath = Y».

Ключ Код A.

Code | Month  | Check | Glidepath 
-------| -----------| ----- -|---------- 
A  | 01/02/2017 | Y  | N 
A  | 01/03/2017 | N  | N 
A  | 01/04/2017 | N  | Y 
A  | 01/05/2017 | N  | N 

Любая идея?

Я пробовал с заявлениями Case.

ответ

3

Не знаю много о синтаксисе оракула, но, по-видимому LAG и LEAD доступны начиная с версии 8.1.6: https://oracle-base.com/articles/misc/lag-lead-analytic-functions

То, что вы хотите сделать, это обновление таблицы для строк с где положение вычислив следующее:

LAG(Check,2) OVER (partition by Code order by month) = 'Y' 

Таким образом, выражение будет верно для каждого кода, где Месяц равен 2 от месяца с чек = y.

Сообщите мне, если это работает, я работаю только с SQL Server.

Если бы это был SQL Server код будет

UPDATE t 
SET Glidepath = 'Y' 
FROM dbo.table as t 
WHERE LAG(t.[Check],2) OVER (PARTITION BY t.[Code] ORDER BY t.[MONTH]) = 'Y' 

Edit: Oto отметил в комментариях, что это работает только, если вы каждый месяц, представленных в наборе данных. Если вам необходимо проверить точное использование даты этого вместо (и если вы заботитесь только о том годе + месяц части преобразовать каждое значение для [Месяца] к соответствующему зернистости):

/*what is the dateadd equivelent in oracle? ADD_MONTHS?*/ 
UPDATE t1 
SET Glidepath = 'Y' 
FROM dbo.[table] AS t1 
WHERE EXISTS (SELECT * FROM dbo.[table] AS t2 WHERE t2.[Month] = DATEADD(MONTH, -2, t1.[MONTH]) AND t2.[Code] = 'Y') 
+0

Он работал отлично, я бы подумал о Лаг/Свинец! Спасибо за совет! – Aurax22

+0

@ Давид - и что, если есть не весь месяц, например, есть только: '2017-04, 2017-05, 2017-11'. В этом случае через 2 месяца с '2017-04' будет' 2017-11'. нет? –

+0

@Oto Я не предполагал каких-либо предполагаемых функциональных возможностей из поля месяца, я интерпретировал этот вопрос как «строку 2-го от той, которая имеет код =« Y », когда упорядочен столбцом« месяц ». –