Db2 для LUW
WITH
RES (VEHICLE_ID, JOB_STATUS, JOB_STATUS_TIME) AS
(
VALUES
(6, 'CREATED', TIMESTAMP('2019-09-25-00.00.09.469059'))
, (6, 'ACTIVE', TIMESTAMP('2019-09-25-13.40.00.981891'))
, (6, 'COMPLETED', TIMESTAMP('2019-09-25-13.45.02.748800'))
, (7, 'CREATED', TIMESTAMP('2019-09-26-00.00.09.469059'))
, (7, 'ACTIVE', TIMESTAMP('2019-09-26-13.40.00.981891'))
, (7, 'PAUSED', TIMESTAMP('2019-09-26-14.40.02.748800'))
, (7, 'ACTIVE', TIMESTAMP('2019-09-26-14.45.09.469059'))
, (7, 'COMPLETED', TIMESTAMP('2019-09-26-14.50.00.981891'))
, (3, 'OPEN', TIMESTAMP('2019-09-27-13.40.02.748800'))
, (3, 'ACTIVE', TIMESTAMP('2019-09-27-13.45.09.469059'))
, (3, 'PAUSED', TIMESTAMP('2019-09-27-13.50.00.981891'))
, (3, 'CANCELLED', TIMESTAMP('2019-09-27-13.51.02.748800'))
)
, A AS
(
SELECT
VEHICLE_ID, JOB_STATUS
, JOB_STATUS_TIME
, LEAD (JOB_STATUS_TIME) OVER (PARTITION BY VEHICLE_ID ORDER BY JOB_STATUS_TIME) AS JOB_STATUS_TIME_NEXT
FROM RES
)
SELECT
VEHICLE_ID
, COUNT(CASE JOB_STATUS WHEN 'CREATED' THEN 1 END) AS CREATED
, COUNT(CASE JOB_STATUS WHEN 'COMPLETED' THEN 1 END) AS COMPLETED
, COUNT(CASE JOB_STATUS WHEN 'CANCELLED' THEN 1 END) AS CANCELLED
, SUM
(
CASE JOB_STATUS WHEN 'ACTIVE' THEN
(DAYS(JOB_STATUS_TIME_NEXT) - DAYS(JOB_STATUS_TIME)) * 86400
+ MIDNIGHT_SECONDS(JOB_STATUS_TIME_NEXT) - MIDNIGHT_SECONDS(JOB_STATUS_TIME)
END
) / 60 AS ACTIVE_MINUTES
FROM A
GROUP BY VEHICLE_ID;
DB2 для iSeries & LUW
Кажется, что в DB2 for iSeries (по крайней мере, мой 7.3) есть ошибка - попытка использовать выражение DAYS(JOB_STATUS_TIME_NEXT)
в приведенном выше запросе результат SQLCODE = -171. Я понятия не имею, в чем причина: если это из-за аргумента функции, полученного из функции OLAP, или по какой-то другой причине ...
Но мы можем переписать запрос следующим образом:
WITH
RES (VEHICLE_ID, JOB_STATUS, JOB_STATUS_TIME) AS
(
VALUES
(6, 'CREATED', TIMESTAMP('2019-09-25-00.00.09.469059'))
, (6, 'ACTIVE', TIMESTAMP('2019-09-25-13.40.00.981891'))
, (6, 'COMPLETED', TIMESTAMP('2019-09-25-13.45.02.748800'))
, (7, 'CREATED', TIMESTAMP('2019-09-26-00.00.09.469059'))
, (7, 'ACTIVE', TIMESTAMP('2019-09-26-13.40.00.981891'))
, (7, 'PAUSED', TIMESTAMP('2019-09-26-14.40.02.748800'))
, (7, 'ACTIVE', TIMESTAMP('2019-09-26-14.45.09.469059'))
, (7, 'COMPLETED', TIMESTAMP('2019-09-26-14.50.00.981891'))
, (3, 'OPEN', TIMESTAMP('2019-09-27-13.40.02.748800'))
, (3, 'ACTIVE', TIMESTAMP('2019-09-27-13.45.09.469059'))
, (3, 'PAUSED', TIMESTAMP('2019-09-27-13.50.00.981891'))
, (3, 'CANCELLED', TIMESTAMP('2019-09-27-13.51.02.748800'))
)
, A AS
(
SELECT
VEHICLE_ID, JOB_STATUS
, JOB_STATUS_TIME
, ROWNUMBER() OVER (PARTITION BY VEHICLE_ID ORDER BY JOB_STATUS_TIME) AS RN
FROM RES
)
SELECT
A1.VEHICLE_ID
, COUNT(CASE A1.JOB_STATUS WHEN 'CREATED' THEN 1 END) AS CREATED
, COUNT(CASE A1.JOB_STATUS WHEN 'COMPLETED' THEN 1 END) AS COMPLETED
, COUNT(CASE A1.JOB_STATUS WHEN 'CANCELLED' THEN 1 END) AS CANCELLED
, SUM
(
CASE A1.JOB_STATUS WHEN 'ACTIVE' THEN
(DAYS(A2.JOB_STATUS_TIME) - DAYS(A1.JOB_STATUS_TIME)) * 86400
+ MIDNIGHT_SECONDS(A2.JOB_STATUS_TIME) - MIDNIGHT_SECONDS(A1.JOB_STATUS_TIME)
END
) / 60 AS ACTIVE_MINUTES
FROM A A1
LEFT JOIN A A2 ON A2.VEHICLE_ID = A1.VEHICLE_ID AND A2.RN = A1.RN + 1
GROUP BY A1.VEHICLE_ID;
Результат:
|VEHICLE_ID |CREATED |COMPLETED |CANCELLED |ACTIVE_MINUTES|
|-----------|-----------|-----------|-----------|--------------|
|3 |0 |0 |1 |4 |
|6 |1 |1 |0 |5 |
|7 |1 |1 |0 |64 |