SQL запрос: получить количество дней для каждого штата - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть таблица, которая содержит список движений:

+----+----------+------------+------------+
| id | boat_id  | date       | state      |
+----+----------+------------+------------+
|  1 |        2 | 2020-01-03 |          1 |
|  2 |        2 | 2020-01-23 |          3 |
|  3 |        2 | 2020-03-02 |          1 |
|  4 |        2 | 2020-03-29 |          2 |
+----+----------+------------+------------+

Мне нужен запрос SQL, чтобы узнать количество дней, в течение которых лодка находится в каждом штате, с указанным диапазоном дат.

Например, с диапазоном 2020-03-01 - 2020-03-31: последним изменением движения было: состояние 3 дата «2020-01-23». Таким образом, состояние 2020-03-01 равно 3 до 2020-03-02, то есть изменяется на 1. Тогда состояние остается равным 1 до 2020-03-29, которое изменяется на 2.

В результате будет: Состояние 3 дня: 1 (с 2020-03-01 до 2020-03-02) Состояние 1 день: 27 (с 2020-03-02 до 2020-03-29) Состояние 2 дня: 3 (с 2020-03-29 до 2020-03-31)

1 Ответ

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

Хммм. , , это немного боли. В конце концов, у вас может не быть даты в вообще .

Но вы можете справиться с этим с помощью lead():

select t.boat_id, t.state,
       sum( datediff(least(coalesce(next_date, '2020-04-01'), '2020-04-01'),
                     greatest(date, '2020-03-01')
                    )
          ) as days_in_march_2020
from (select t.*,
             lead(date) over (partition by boat_id order by date) as next_date
      from t
     ) t
where date < '2020-04-01' and
      (next_date is null or next_date >= '2020-03-01')
group by t.boat_id, t.state
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...