PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

изчисляване на сумата от стойности, свързани с припокриващи се периоди от време

Ето моя опит да реша този проблем:

select y,
     sum( hrs_per_week )
from tmp_ranges t
join(
  select daterange( x,
         lead(x) over (order by x) ) As y
  from (
    select lower( rng ) As x
    from tmp_ranges
    union 
    select upper( rng )
    from tmp_ranges
    order by x
  ) y
) y
on t.rng && y.y
group by y
order by y

Демонстрация:http://sqlfiddle.com/#!15/ef6cb/13

Най-вътрешната подзаявка събира всички гранични дати в един набор с помощта на union , след което ги сортира.
След това външната подзаявка изгражда нови диапазони от съседни дати с помощта на lead функция.
В крайна сметка тези нови диапазони се присъединяват към изходната таблица в главната заявка, агрегирани и sum се изчислява.

РЕДАКТИРАНЕ
Поръчката order by клаузата в най-вътрешната заявка е излишна и може да бъде пропусната, защото lead(x) over caluse подрежда записите по дати и набор от резултати от най-вътрешната подзаявка не трябва да се сортира.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ограничение на Postgres

  2. JBoss7 + PostgreSQL Нови липсващи/неудовлетворени зависимости

  3. []низ към jsonb с Gorm и postgres

  4. psql:не можа да се свърже със сървър:Няма такъв файл или директория (Mac OS X)

  5. Защо трябва да научите PostgreSQL?