Я хочу создать новый столбец, в данном случае «Повторить», который помечает «ДА» для строк, которые имеют один и тот же ключ (Клэйв) и имеют менее 7 дней между resolutiondate
и createddate
, а столбец Massive
должен быть «НЕТ». ". Вот пример того, что я хочу получить.
Я хочу попробовать использовать формулу lead and lag
для сортировки дат от самой низкой до самой высокой, но не знаю, как применить ее в SQL. Я не совсем уверен, можно ли получить этот столбец.
Любая помощь очень ценится. Большое спасибо
Редактировать.
Я использовал формулу, которую вы предлагаете, и она работает! , Еще раз спасибо всем за помощь :)
SELECT top 100
CF1.STRINGVALUE AS 'ID OT',
jis.created,
jis.resolutiondate,
IIF(CF3.STRINGVALUE like 'IDR-%','SI','NO') AS 'Massive',
cfo8.customvalue AS 'Solved',
CASE WHEN jis.resolutiondate IS NULL
THEN 'NO'
WHEN LAG(resolutiondate) OVER (PARTITION BY 'ID OT' ORDER BY resolutiondate) > DATEADD(DAY, -7, resolutiondate)
AND LAG(CF3.STRINGVALUE) OVER (PARTITION BY 'ID OT' ORDER BY resolutiondate) = 'NO'
AND LAG(cfo8.customvalue) OVER (PARTITION BY 'ID OT' ORDER BY resolutiondate) = 'NO'
THEN 'NO'
ELSE 'YES'
END AS SLA
FROM [DWH].[JIR].[jiraissue] jis
LEFT JOIN [DWH].[JIR].[customfieldvalue] CF1 ON (CF1.issue = jis.id AND CF1.CUSTOMFIELD = 10004)
LEFT JOIN [DWH].[JIR].[customfieldvalue] CF3 ON (CF3.issue = jis.id AND CF3.CUSTOMFIELD = 10032)
LEFT JOIN [DWH].[JIR].[customfieldvalue] CF14 ON (CF14.issue = jis.id AND CF14.CUSTOMFIELD = 10906)
LEFT JOIN [DWH].[JIR].customfieldoption cfo8 ON (CF14.customfield = cfo8.customfield AND CF14.stringvalue=CAST(cfo8.id AS CHAR))
Если я правильно вас понимаю, вы можете использовать оконные функции:
select t.*,
case
when lag(resolutiondate) over(partition by key order by resolutiondate) > dateadd(day, -7, resolutiondate)
and lag(massive) over(partition by key order by resolutiondate) = 'NO'
then 'SI'
else 'NO'
end as sla
from mytable t
Это сравнивает дату в текущей строке с датой в предыдущей строке и проверяет статус massive
в предыдущей строке.
Возможно, вы хотите проверить статус текущей строки, а не предыдущей — это немного проще:
select t.*,
case
when lag(resolutiondate) over(partition by key order by resolutiondate) > dateadd(day, -7, resolutiondate)
and massive = 'NO'
then 'SI'
else 'NO'
end as sla
from mytable t
Я думаю, что это логика, которую вы хотите:
select t.*,
(case when massive = 'SI' then 'NO'
when lag(resolutiondate) over (partition by key) <
dateadd(-7, day, creationdate
then 'No'
else 'Si'
end) as SLA
from t;
То, как это написано, не кажется необходимым оценивать ключевой столбец. Даты разрешения одинаковы для каждого ключа. Что-то вроде этого
select t.*,
case when t.massive='No' and dt.diff<7
then 'Si'
else 'No' end SLA
from tTable t
cross apply (values (datediff(day, created, resolutiondate))) dt(diff);