SQL查询,返回基于行数的日期条目

朋友

我有一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

强制从SQL查询返回日期范围内的行数

来自分类Dev

基于日期和日期的SQL查询

来自分类Dev

SQL查询返回行数大于1的地方

来自分类Dev

SQL查询返回行数大于1的地方

来自分类Dev

SQL查询返回每月行数很慢

来自分类Dev

SQL查询返回基于多个日期列的最新记录更新(tricky?)

来自分类Dev

如何基于日期自动运行SQL查询?

来自分类Dev

SQL查询以基于日期创建字段

来自分类Dev

SQl查询以基于日期差异获取表

来自分类Dev

SQL查询返回基于当前日期的另一个Datetime列的唯一日期?

来自分类Dev

SQL查询基于时间的返回计数

来自分类Dev

优化查询以返回行数

来自分类Dev

SQL查询以基于月结束日期生成月薪日期

来自分类Dev

SQL更新基于行数

来自分类Dev

SQL返回日期基于另一列的日期

来自分类Dev

SQL查询仅返回一个条目,而应返回多个条目

来自分类Dev

SQL错误(1242):子查询返回的行数超过1

来自分类Dev

SQL错误(1242):子查询返回的行数超过1

来自分类Dev

SQL查询返回行数,直到满足特定条件为止

来自分类Dev

如何在SQL查询中返回更新的行数?

来自分类Dev

SQL Join查询以返回总和和最新条目

来自分类Dev

SQL:嵌套子查询错误地返回条目

来自分类Dev

SQL Join查询以返回总和和最新条目

来自分类Dev

SQL查询在日期后返回数据。日期设置为varcher

来自分类Dev

从日期列表中返回季度日期的 SQL 查询

来自分类Dev

SQL 计数查询返回预设为 1 的行数而不是实际行数

来自分类Dev

SQL查询以基于当前日期获取数据

来自分类Dev

返回查询结果和行数

来自分类Dev

无法计算查询返回的行数