PostgreSQL построить рабочий диапазон из одного столбца даты - PullRequest
0 голосов
/ 27 апреля 2020

Я использую PostgreSQL v. 11.2

У меня есть таблица

|id | bot_id |        date        |
| 1 |  1     | 2020-04-20 16:00:00| 
| 2 |  2     | 2020-04-22 12:00:00| 
| 3 |  3     | 2020-04-24 04:00:00| 
| 4 |  1     | 2020-04-27 09:00:00| 

И, например, у меня есть диапазон DateTime 2020-03-30 00:00:00 и 2020-04-30 00:00:00

Мне нужно показать рабочие диапазоны для подсчета общего рабочего времени каждого бота.

Примерно так:

|bot_id | start_date          |       end_date       |
| 1     | 2020-03-30 00:00:00 |  2020-04-20 16:00:00 |
| 2     | 2020-04-20 16:00:00 |  2020-04-22 12:00:00 |
| 3     | 2020-04-22 12:00:00 |  2020-04-24 04:00:00 |
| 1     | 2020-04-24 04:00:00 |  2020-04-27 09:00:00 |
| 1     | 2020-04-27 09:00:00 |  2020-04-30 00:00:00 |

Я пытался использовать LAG(date), но я ' Я не получаю первые и последние даты диапазона.

1 Ответ

2 голосов
/ 27 апреля 2020

Вы можете использовать UNION ALL, при этом одна часть строит пары start_date / end_date из ваших значений, а другая часть заполняет последний период (от последнего date до 2020-04-30 00:00:00):

WITH values (id, bot_id, date) AS (
    VALUES (1, 1, '2020-04-20 16:00:00'::TIMESTAMP)
         , (2, 2, '2020-04-22 12:00:00')
         , (3, 3, '2020-04-24 04:00:00')
         , (4, 1, '2020-04-27 09:00:00')
)
(
    SELECT bot_id
         , LAG(date, 1, '2020-03-30 00:00:00') OVER (ORDER BY id) AS start_date
         , date                                                   AS end_date
    FROM values
)
UNION ALL
(
    SELECT bot_id
         , date                  AS start_date
         , '2020-04-30 00:00:00' AS end_date
    FROM values
    ORDER BY id DESC
    LIMIT 1
)

+------+--------------------------+--------------------------+
|bot_id|start_date                |end_date                  |
+------+--------------------------+--------------------------+
|1     |2020-03-30 00:00:00.000000|2020-04-20 16:00:00.000000|
|2     |2020-04-20 16:00:00.000000|2020-04-22 12:00:00.000000|
|3     |2020-04-22 12:00:00.000000|2020-04-24 04:00:00.000000|
|1     |2020-04-24 04:00:00.000000|2020-04-27 09:00:00.000000|
|1     |2020-04-27 09:00:00.000000|2020-04-30 00:00:00.000000|
+------+--------------------------+--------------------------+
...