我有一个postgres DB表,该表跟踪季度事件,季度事件日期和成本。每个事件至少有5个季度的信息,某些事件有8个或更多个季度的信息。
样品表
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,则返回第一个季度的行和最后一个行。如果事件有七个或更多季度,则返回最后一个季度行(最新日期)和第六个季度。即,如果一个事件具有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
提前致谢
示例数据:
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);
选择:
-按降序排列的行号,以及
-按事件划分的分区中的行数
并选择:
-分区中的第一行,以及
-第七行或最后一行,具体取决于哪个数字较小。
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句