Считайте дни между датами на основе нескольких условий - PullRequest
0 голосов
/ 09 июля 2020

У меня есть таблица с датами, идентификаторами и состояниями. Внутри функции postgres мне нужно ввести start_date и end_date. Теперь, основываясь на этих введенных датах, счетчик использования и доступные дни должны быть возвращены как ID -> count.

Пример таблицы:

(ID)    (Date)        (State)
1     01-01-2020     Available
1     02-01-2020      In Use
1     05-01-2020     Available
1     06-01-2020      In Use
2     01-01-2020     Available
2     21-01-2020      In Use

Допустим, я ввожу: start_date = ' 01-01-2020 'и end_date = '31 -01-2020'

Результат должен быть:

(ID)         (Usage Days)
1              29
2              11

Как он рассчитывается:

  • Для устройства 1: (со 2-го по 5-е) = 3 дня; С 6 по 31 = 26 дней; SO 26 + 3 = 29

  • Для устройства 2: (с 21-го по 31-е) = 11 дней

1 Ответ

1 голос
/ 09 июля 2020

Это работает для меня. dbfiddle

with parms as (
  select '2020-01-01'::date as start_date,
         '2020-01-31'::date as end_date
), runs as (
  select u.*, 
         extract(days from coalesce(lead(ddate) over w, p.end_date + interval '1 day') - ddate) as runlength
  from parms p
  join usagelog u
    on u.ddate between p.start_date and p.end_date
window w as (partition by id order by ddate)
)
select id, 
       sum(runlength) filter (where state = 'Available') as available_days,
       sum(runlength) filter (where state = 'In Use') as usage_days
  from runs
 group by id
 order by id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...