2014-12-17 2 views
0

У меня есть вопрос, который предоставляет ниже результаты.SQL Old & New Values ​​и Time Differences

WORK_ITEM_ID WORK_ITEM_STA_CD CREAT_TS 
    1     8    2014-12-17 16:20:06.250 
    1     9    2014-12-17 16:23:48.430 
    2     8    2014-12-17 16:20:06.250 
    2     9    2014-12-17 16:24:36.930 
    3     8    2014-12-17 16:20:06.250 
    4     8    2014-12-17 16:20:06.250 
    5     8    2014-12-17 16:20:06.250 

Я хочу, чтобы новый столбец как OLD_STA_CD & разницы во времени получить результат, как показано ниже. может ли кто-нибудь направить меня к этому.

WORK_ITEM_ID OLD_STA_CD WORK_ITEM_STA_CD CREAT_TS    TimeDifference 
    1    null   8   2014-12-17 16:20:06.250  
    1    8    9   2014-12-17 16:23:48.430 Thisrow - Previous Row 
    2    null   8   2014-12-17 16:20:06.250 
    2    8    9   2014-12-17 16:24:36.930 Thisrow - Previous Row 
    3    null   8   2014-12-17 16:20:06.250 
    4    null   8   2014-12-17 16:20:06.250 
    5    null   8   2014-12-17 16:20:06.250        

ответ

1

Использование Window Function и Left join

;WITH cte 
    AS (SELECT Row_number()OVER(partition BY WORK_ITEM_ID ORDER BY CREAT_TS) rn, 
       * 
     FROM tablename) 
SELECT a.WORK_ITEM_ID, 
     OLD_STA_CD= b.WORK_ITEM_STA_CD, 
     a.WORK_ITEM_STA_CD, 
     a.CREAT_TS, 
     Time_Diff_In_Seconds=Datediff(ss, b.CREAT_TS, a.CREAT_TS) 
FROM cte a 
     LEFT JOIN cte b 
       ON a.WORK_ITEM_ID = b.WORK_ITEM_ID 
       AND a.rn = b.rn + 1 

Если вы используете Sql Server 2012+ использовать LAG Function для извлечения предыдущего ряда

SELECT WORK_ITEM_ID, 
     OLD_STA_CD=Lag(WORK_ITEM_STA_CD)OVER(partition BY WORK_ITEM_ID ORDER BY CREAT_TS), 
     WORK_ITEM_STA_CD, 
     CREAT_TS, 
     Time_Diff_In_Seconds=Datediff(ss, Lag(CREAT_TS)OVER(partition BY WORK_ITEM_ID ORDER BY CREAT_TS), CREAT_TS) 
FROM Tablename 
+0

Спасибо ... Я пытался такой же подход, но в сложном пути. Ваше решение прост и работает нормально – sk7730

+0

@ sk7730 - Рад, что это помогло вам –

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