PostgreSQL Цена для нескольких диапазонов дат - PullRequest
0 голосов
/ 05 мая 2011

У меня есть следующая таблица тарифов для данного диапазона дат.

Я хочу написать SQL-запрос (PostgreSQL), чтобы получить сумму цен за данный период, если это непрерывный период .. например:

если я укажу с 2011-05-02 по 2011-05-09 в первом наборе, должна быть возвращена сумма из 6 строк,

, но

, если яукажите во втором наборе с 2011-05-02 по 2011-05-011 ничего не должно быть возвращено.

Моя проблема в том, что я не знаю, как определить, является ли диапазон дат непрерывным ... не могли бы вы помочь?Большое спасибо

дело 1: ожидаемая сумма

 price       from_date      to_date
------    ------------  ------------
   1.0      "2011-05-02"  "2011-05-02"
   2.0      "2011-05-03"  "2011-05-03"
   3.0      "2011-05-04"  "2011-05-05"
   4.0      "2011-05-05"  "2011-05-06"
   5.0      "2011-05-06"  "2011-05-07"
   4.0      "2011-05-08"  "2011-05-09"

дело 2: никаких результатов не ожидается

 price       from_date      to_date
------    ------------  ------------
   1.0      "2011-05-02"  "2011-05-02"
   2.0      "2011-05-03"  "2011-05-03"
   3.0      "2011-05-07"  "2011-05-09"
   4.0      "2011-05-09"  "2011-05-011"

У меня нет перекрывающихся диапазонов дат.

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Не уверен, что я полностью понял вопрос, но что по этому поводу:

select * 
from prices
where not exists (
  select 1 from (
     select from_date - lag(to_date) over (partition by null order by from_date asc) as days_diff
     from prices
     where from_date >= DATE '2011-05-01' 
       and to_date < DATE '2011-07-01'
  ) t 
  where coalesce(days_diff, 0) > 1
) 
order by from_date
0 голосов
/ 08 мая 2011

Я думаю, вам нужно объединить оконные функции и CTE:

WITH
raw_rows AS (
SELECT your_table.*,
       lag(to_date) OVER w as prev_date,
       lead(from_date) OVER w as next_date
FROM your_table
WHERE ...
WINDOW w as (ORDER by from_date, to_date)
)
SELECT sum(stuff)
FROM raw_rows
HAVING bool_and(prev_date >= from_date - interval '1 day' AND
                next_date <= to_date + interval '1 day');

http://www.postgresql.org/docs/9.0/static/tutorial-window.html

http://www.postgresql.org/docs/9.0/static/queries-with.html

0 голосов
/ 05 мая 2011

Вот довольно странный способ решить эту проблему:

WITH RECURSIVE t AS (
  SELECT * FROM d WHERE '2011-05-02' BETWEEN start_date AND end_date 
  UNION ALL
  SELECT d.* FROM t JOIN d ON (d.key=t.key AND d.start_date=t.end_date+'1 DAY'::INTERVAL)  
     WHERE d.start_date <= '2011-05-09') 
  SELECT sum(price), min(start_date), max(end_date) 
  FROM t 
  HAVING min(start_date) <= '2011-05-02' AND max(end_date)>= '2011-05-09';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...