sql >> Databáze >  >> RDS >> PostgreSQL

vypočítat součet hodnot spojených s překrývajícími se obdobími

Zde je můj pokus o vyřešení tohoto problému:

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

Ukázka:http://sqlfiddle.com/#!15/ef6cb/13

Nejvnitřnější poddotaz shromažďuje všechna hraniční data do jedné sady pomocí union , pak je seřadí.
Pak vnější dílčí dotaz vytvoří nové rozsahy ze sousedních dat pomocí lead funkce.
Nakonec jsou tyto nové rozsahy připojeny ke zdrojové tabulce v hlavním dotazu, agregovány a sum se počítá.

EDIT
order by klauzule v nejvnitřnějším dotazu je nadbytečná a lze ji přeskočit, protože lead(x) over caluse seřadí záznamy podle dat a sada výsledků z nejvnitřnějšího poddotazu se nemusí třídit.




  1. Anotace Hibernate 4 – Chyba konfigurace MySQL:java.sql.SQLException:Nelze přidat omezení cizího klíče

  2. Průvodce Pgpool pro PostgreSQL:Část první

  3. PostgreSQL změnit časové razítko typu bez časového pásma -> s časovým pásmem

  4. Jak naplnit kalendářní tabulku v Oracle?