Последовательные даты postgresql

104
10

Мне нужно знать, нет ли последовательных дат для каждого документа. У меня есть эта таблица:

document | the_day  
1 | 2015-01-01
1 | 2015-01-02
1 | 2015-01-03
1 | 2015-01-04
1 | 2015-01-05
1 | 2015-01-06
2 | 2015-01-01
2 | 2015-01-03
2 | 2015-01-04
2 | 2015-01-05
2 | 2015-01-06
3 | 2015-01-01
3 | 2015-01-02
3 | 2015-01-03
3 | 2015-01-04
3 | 2015-01-05
3 | 2015-01-06

Как вы видите, есть только один пробел: в документе 2 отсутствует "2015-01-02". Я хочу знать этот пробел. У меня есть этот выбор:

SELECT document, the_day, the_day - lag(the_day) OVER w AS gap
FROM mytable
where active=true and fault=false
WINDOW w AS (ORDER BY document,the_day)

Этот выбор дает мне регистрацию на дату и пробел, который в большинстве случаев равен 1, но когда в результате начинается другой документ, это дает мне неправильный пробел. Я не знаю, правильно ли это или сделать функцию... Вот код для построения таблицы:

--Table: public.test_consecutives

--DROP TABLE public.test_consecutives;

CREATE TABLE public.test_consecutives (
document integer,
the_day date
) WITH (
OIDS = FALSE
);

ALTER TABLE public.test_consecutives
OWNER TO postgres;
INSERT INTO test_consecutives (document, the_day) VALUES
(1, '2015-01-01'),
(1, '2015-01-02'),
(1, '2015-01-03'),
(1, '2015-01-04'),
(1, '2015-01-05'),
(1, '2015-01-06'),
(2, '2015-01-01'),
(2, '2015-01-03'),
(2, '2015-01-04'),
(2, '2015-01-05'),
(2, '2015-01-06'),
(3, '2015-01-01'),
(3, '2015-01-02'),
(3, '2015-01-03'),
(3, '2015-01-04'),
(3, '2015-01-05'),
(3, '2015-01-06');

спросил(а) 2015-05-05T11:09:00+03:00 4 года, 9 месяцев назад
1
Решение
72

Если вы не укажете PARTITION PostgreSQL будет считать, что это вся таблица. Ваш запрос должен включать предложение PARTITION BY:

SELECT document, the_day, the_day - lag(the_day) OVER w AS gap
FROM mytable
where active=true and fault=false
WINDOW w AS (PARTITION BY document ORDER BY document,the_day)

ответил(а) 2015-05-05T11:22:00+03:00 4 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема