Разница в дате для того же идентификатора - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть набор данных, похожий на

    +----+------------+------------+------------+

    | ID |   Udate    | last_code  | Ddate      | 
    +----+------------+------------+------------+
    |  1 | 05/11/2018 | ACCEPTED   | 13/10/2018 |
    |  1 | 03/11/2018 | ATTEMPT    | 13/10/2018 | 
    |  1 | 01/11/2018 | INFO       | 13/10/2018 |
    |  1 | 22/10/2018 | ARRIVED    | 13/10/2018 | 
    |  1 | 15/10/2018 |   SENT     | 13/10/2018 | 
    +----+------------+------------+------------+

Я пытаюсь получить разницу в датах для каждого кода в Udate, но для первой даты я хочу сделать датировку различий между Udate и Ddate.

Итак, я пытался:

DATEDIFF(DAY,LAG(Udate) OVER (PARTITION BY Shipment_Number ORDER BY Udate), Udate)

, чтобы получить разницу между датами, и пока она работает, но мне также нужна первая разница дат между Udate и Ddate.

Я думал о ISNULL()

Кроме того, в конце мне нужно среднее количество дней между кодами, обычно они сохраняют ту же схему.Пример выходных данных:

    +----+------------+------------+------------+------------+

    | ID |   Udate    | last_code  | Ddate      | Difference |
    +----+------------+------------+------------+------------+
    |  1 | 05/11/2018 | ACCEPTED   | 13/10/2018 |     2      |
    |  1 | 03/11/2018 | ATTEMPT    | 13/10/2018 |     2      |
    |  1 | 01/11/2018 | INFO       | 13/10/2018 |     10     |
    |  1 | 22/10/2018 | ARRIVED    | 13/10/2018 |     7      |
    |  1 | 15/10/2018 |   SENT     | 13/10/2018 |     2      |
    +----+------------+------------+------------+------------+

Обратите внимание, что при отсутствии предыдущего кода разница между датами находится между Udate и Ddate.

Буду признателен за любую идею.

Спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Хорошо, ISNULL - это путь.
Поскольку вы также хотите получить среднюю разницу, вы можете использовать общее табличное выражение, чтобы получить разницу, и запросить ее, чтобы получить среднее значение:

Во-первых, создайте и заполните пример данных ( Пожалуйста сохраните этот шаг в ваших будущих вопросах)

-- This would not be needed if you've used ISO8601 for date strings (yyyy-mm-dd | yyyymmdd)
SET DATEFORMAT DMY; 

DECLARE @T AS TABLE
    (
    ID int,
    UDate date,
    last_code varchar(10),
    Ddate date
    ) ;

INSERT INTO @T (ID, Udate, last_code, Ddate) VALUES

(1, '05/11/2018', 'ACCEPTED', '13/10/2018'),
(1, '03/11/2018', 'ATTEMPT' , '13/10/2018'), 
(1, '01/11/2018', 'INFO'    , '13/10/2018'),
(1, '22/10/2018', 'ARRIVED' , '13/10/2018'), 
(1, '15/10/2018', 'SENT'    , '13/10/2018');

Cte:

WITH CTE AS
(
    SELECT  ID, 
            Udate, 
            last_code, 
            Ddate,
            DATEDIFF(
                DAY, 
                ISNULL(
                    LAG(Udate) OVER(PARTITION BY ID ORDER BY Udate), 
                    Ddate
                ), 
                UDate
            ) As Difference
    FROM @T
)

Запрос:

SELECT *, AVG(Difference) OVER(PARTITION BY ID) As AverageDifference
FROM CTE;

Результаты:

ID  Udate       last_code   Ddate       Difference  AverageDifference
1   15.10.2018  SENT        13.10.2018  2           4
1   22.10.2018  ARRIVED     13.10.2018  7           4
1   01.11.2018  INFO        13.10.2018  10          4
1   03.11.2018  ATTEMPT     13.10.2018  2           4
1   05.11.2018  ACCEPTED    13.10.2018  2           4
...