SQL как получить последнюю дату и обновлять каждый раз, когда это происходит (не используя MAX) - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь получить самую последнюю дату начала события, прежде чем оно произойдет снова.

У меня есть данные:

+-----+------------------+--------+--------+--+
| ID  |       DATE       | REGION | STATUS |  |
+-----+------------------+--------+--------+--+
| 200 | 2020-04-10 6:00  | USA    | START  |  |
| 200 | 2020-04-10 7:00  | USA    | ACTIVE |  |
| 200 | 2020-04-10 13:00 | USA    | STOP   |  |
| 200 | 2020-04-10 15:00 | USA    | START  |  |
| 200 | 2020-04-10 16:00 | USA    | ACTIVE |  |
| 200 | 2020-04-10 19:00 | USA    | ACTIVE |  |
| 200 | 2020-04-10 20:00 | USA    | STOP   |  |
+-----+------------------+--------+--------+--+

Что я хочу сделать:

+-----+------------------+--------+--------+------------------+
| ID  |       DATE       | REGION | STATUS | LAST_START_DATE  |
+-----+------------------+--------+--------+------------------+
| 200 | 2020-04-10 6:00  | USA    | START  | 2020-04-10 6:00  |
| 200 | 2020-04-10 7:00  | USA    | ACTIVE | 2020-04-10 6:00  |
| 200 | 2020-04-10 13:00 | USA    | STOP   | 2020-04-10 6:00  |
| 200 | 2020-04-10 15:00 | USA    | START  | 2020-04-10 15:00 |
| 200 | 2020-04-10 16:00 | USA    | ACTIVE | 2020-04-10 15:00 |
| 200 | 2020-04-10 20:00 | USA    | STOP   | 2020-04-10 15:00 |
| 200 | 2020-04-10 20:00 | USA    | STOP   | 2020-04-10 15:00 |
+-----+------------------+--------+--------+------------------+

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

Что я пытался:

SELECT id, date, region, status, last_start_date
 FROM (SELECT t1.*,
             MAX(CASE WHEN status = 'START' THEN date END) OVER (PARTITION BY id,region) as last_start_date
             FROM table1 t1
     ) t1
    GROUP BY id,region,status

Это не сработало, поскольку MAX возвращает только отображаемую последнюю версию, а это не то, что я пытался сделать:

+-----+------------------+--------+--------+------------------+
| ID  |       DATE       | REGION | STATUS | LAST_START_DATE  |
+-----+------------------+--------+--------+------------------+
| 200 | 2020-04-10 6:00  | USA    | START  | 2020-04-10 15:00 |
| 200 | 2020-04-10 7:00  | USA    | ACTIVE | 2020-04-10 15:00 |
| 200 | 2020-04-10 13:00 | USA    | STOP   | 2020-04-10 15:00 |
| 200 | 2020-04-10 15:00 | USA    | START  | 2020-04-10 15:00 |
| 200 | 2020-04-10 16:00 | USA    | ACTIVE | 2020-04-10 15:00 |
| 200 | 2020-04-10 20:00 | USA    | STOP   | 2020-04-10 15:00 |
+-----+------------------+--------+--------+------------------+

Каков был бы правильный подход для достижения этой цели? моя цель?

1 Ответ

3 голосов
/ 21 апреля 2020

Вы почти сделали это - вам просто нужно добавить order by предложение:

DECLARE @DataSource TABLE
(
    [ID] INT
   ,[DATE] DATETIME2(0)
   ,[REGION] CHAR(3)
   ,[STATUS] VARCHAR(12)
);

INSERT INTO @DataSource ([ID], [DATE], [REGION], [STATUS])
VALUES ('200', '2020-04-10 6:00', 'USA', 'START')
      ,('200', '2020-04-10 7:00', 'USA', 'ACTIVE')
      ,('200', '2020-04-10 13:00', 'USA', 'STOP')
      ,('200', '2020-04-10 15:00', 'USA', 'START')
      ,('200', '2020-04-10 16:00', 'USA', 'ACTIVE')
      ,('200', '2020-04-10 19:00', 'USA', 'ACTIVE')
      ,('200', '2020-04-10 20:00', 'USA', 'STOP');

SELECT *
      ,MAX(CASE WHEN status = 'START' THEN date END) OVER (PARTITION BY id,region ORDER BY [DATE])
FROM @DataSource;

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...