новичок в MS SQL, должен найти разницу в часах первого и второго ряда одного столбца - PullRequest
1 голос
/ 22 апреля 2020

Например. сравнивая первую строку и вторую строку invoice_status_change_datetime, пока она не перейдет в другой статус, нужно зафиксировать продолжительность в часах.

**AP_WORK_ID    INVOICE_STATUS  INVOICE_STATUS_CHANGE_DATETIME   LAST_UPDATED_USER**
  1060565       Assigned        **2020-01-27 07:17:57.837**          xxxxxx
  1060565       Assigned        **2020-01-27 10:17:57.837**          yyyyyy
  1060565       In Progress       2020-01-29 01:08:56.943            xxxxxx
  1060565       Rejected          2020-01-28 07:17:57.837            xxxxxx
  1060565       Hold              2020-01-28 10:17:57.837            yyyyyy
  1060565       Closed            2020-01-29 01:08:56.943            xxxxxx

Но результат должен быть таким, как показано ниже, потому что я хочу объединить этот результат с другими условия соединения

**AP_WORK_ID    Assigned_hrs  In Progress_hrs  Query_Resolved_hrs Rejected_hrs hold_hrs closed_hrs**
  1060565       24            3 hrs            null               10hrs        5hrs     null

Я попробовал код, используя lead (), я получаю вывод также в часах, но я не знаю, как преобразовать в вышеуказанном формате:

SELECT isc.INVOICE_STATUS,
    isc.INVOICE_STATUS_CHANGE_DATETIME,
    DATEDIFF(HH, isc.INVOICE_STATUS_CHANGE_DATETIME, LEAD(isc.INVOICE_STATUS_CHANGE_DATETIME) OVER(
    ORDER BY isc.INVOICE_STATUS_CHANGE_DATETIME)) AS status_change_Hours       
FROM INVOICE_STATUS_CHANGE ISC
where isc.AP_WORK_ID = 1060565
GROUP BY isc.INVOICE_STATUS, isc.INVOICE_STATUS_CHANGE_DATETIME

I понять, что это немного сложно, может ли любой, кто освоил SQL знать, как этого добиться

1 Ответ

0 голосов
/ 22 апреля 2020

Я думаю lead() и условное агрегирование:

select
    ap_work_id,
    sum(case when invoice_status = 'Assigned'    
        then datediff(hour, change_dt, next_change_dt) end) assigned_hrs,
    sum(case when invoice_status = 'In Progress' 
        then datediff(hour, change_dt, next_change_dt) end) in_progress_hrs,
    sum(case when invoice_status = 'Rejected'
        then datediff(hour, change_dt, next_change_dt) end) rejected_hrs,
    sum(case when invoice_status = 'Hold' 
        then datediff(hour, change_dt, next_change_dt) end) hold_hrs,
    sum(case when invoice_status = 'Closed' 
        then datediff(hour, change_dt, next_change_dt) end) closed_hrs
from (
    select 
        ap_work_id,
        invoice_status,
        invoice_status_change_datetime change_dt,
        lead(invoice_status_change_datetime) 
            over(partition by ap_work_id order by invoice_status_change_datetime) next_change_dt
    from mytable t
) t
group by ap_work_id

Демонстрация по БД Fiddle :

ap_work_id | assigned_hrs | in_progress_hrs | rejected_hrs | hold_hrs | closed_hrs
---------: | -----------: | --------------: | -----------: | -------: | ---------:
   1060565 |           18 |               6 |            3 |       15 |       <em>null</em>

Результаты немного отличается от того, что вы показали (и мне пришлось зафиксировать дату в строке, имеющей статус «Назначено», которая не соответствовала остальным данным), но я думаю, что они на самом деле верны для ваших выборочных данных.

...