2016-07-30 2 views
0

У меня есть таблица DB postgres, которая отслеживает ежеквартальное событие, ежеквартальную дату события и стоимость. Каждое событие имеет не менее 5 кварталов информации, некоторые события имеют 8 и более кварталов.SQL-запрос, возвращающие строки на основе числа записей даты

образца Таблица

EventA | 2013-01-01 | 500 EventA | 2013-04-01 | 600 EventA | 2013-07-01 | 700 EventA | 2013-10-01 | 700 EventA | 2014-01-01 | 750 EventB | 2013-01-01 | 400 EventB | 2013-04-01 | 500 EventB | 2013-07-01 | 600 EventB | 2013-10-01 | 600 EventB | 2014-01-01 | 575 EventB | 2014-04-01 | 700 EventB | 2014-07-01 | 750 EventB | 2014-10-01 | 800 EventB | 2015-01-01 | 800 EventB | 2015-04-01 | 840

Я хотел бы быть в состоянии сделать следующее с помощью запроса. Если событие имеет 6 или менее строк, верните строку первой четверти и последнюю. Если событие имеет 7 и более кварталов, верните последнюю четверть строки (последняя дата) и 6-й квартал назад. I.e., если событие имеет 3 года информации, 12 кварталов, я бы хотел увидеть 12-й квартал и 6-й квартал.

Я знаю, как использовать функцию окон, чтобы возвращать подсчет квартала по событию и использовать вспомогательный запрос для получения результатов на основе количества кварталов события, то есть менее 6 или больше, чем 10. После этого я застрял. Я думаю, что мне нужно будет взять эти результирующие наборы и объединить их, чтобы вернуть строки, которые мне нужны, но не знаю, как это сделать.

Так Выборочные данные, возвращаемые из выше примера будет

EventA | 2013-01-01 | 500 EventA | 2014-01-01 | 750 EventB | 2013-10-01 | 600 EventB | 2015-04-10 | 840

Заранее спасибо

+0

Отсутствует: версия Postgres, определение таблицы, запрос, который вы пробовали. –

ответ

1

Пример данные:

create table events (event text, quarter date, cost integer); 
insert into events values 

('EventA', '2013-01-01', 500), 
('EventA', '2013-04-01', 600), 
('EventA', '2013-07-01', 700), 
('EventA', '2013-10-01', 700), 
('EventA', '2014-01-01', 750), 
('EventB', '2013-01-01', 400), 
('EventB', '2013-04-01', 500), 
('EventB', '2013-07-01', 600), 
('EventB', '2013-10-01', 600), 
('EventB', '2014-01-01', 575), 
('EventB', '2014-04-01', 700), 
('EventB', '2014-07-01', 750), 
('EventB', '2014-10-01', 800), 
('EventB', '2015-01-01', 800), 
('EventB', '2015-04-01', 840); 

Выбрать:
- номер строки в порядке убывания и
- количество строк в па rtitions по событию

и выбрать:
- первая строка в перегородке и
- седьмой или последняя строка в зависимости, число которых меньше.

select event, quarter, cost 
from (
    select 
     *, 
     row_number() over (partition by event order by quarter desc) rn, 
     count(*) over (partition by event) maxn 
    from events 
    ) s 
where rn = 1 or rn = least(maxn, 7) 
order by 1, 2; 

event | quarter | cost 
--------+------------+------ 
EventA | 2013-01-01 | 500 
EventA | 2014-01-01 | 750 
EventB | 2013-10-01 | 600 
EventB | 2015-04-01 | 840 
(4 rows) 
+0

Спасибо, клин, я бы поднял это много раз, если бы мог. Я не думал, что решение будет таким прямым. У меня был этот запрос, но у меня не было правила where where. – tman

Смежные вопросы