【发布时间】:2019-09-16 19:26:34
【问题描述】:
我正在尝试找到一个函数,让我可以创建将原始日期转换为剧集的功能,我可以在其中设置构成剧集的参数。对于此示例,日期之间的 3 天间隔将是一个新的“情节”,但最终希望将其缩放为任意 x =
我已经尝试过间隙和孤岛问题以及领先和滞后 1 天的时间段,但无法获得代码来为每个 3 天的窗口间隔提供一行。
drop table RUNNING_LOG;
create table running_log (
run_date date not null,
time_in_seconds int not null,
distance_in_miles int not null
);
truncate table running_log;
begin
insert into running_log values (date'2018-01-01', 420, 1);
insert into running_log values (date'2018-01-02', 2400, 5);
insert into running_log values (date'2018-01-03', 2430, 5);
insert into running_log values (date'2018-02-06', 2350, 5);
insert into running_log values (date'2018-02-07', 410, 1);
insert into running_log values (date'2018-07-10', 400, 1); ---4 month gap
insert into running_log values (date'2018-08-13', 2300, 5);
insert into running_log values (date'2018-12-31', 425, 1);
insert into running_log values (date'2019-01-01', 422, 1);
insert into running_log values (date'2019-01-06', 2350, 5);
insert into running_log values (date'2019-02-07', 410, 1);
insert into running_log values (date'2019-06-10', 400, 1);
insert into running_log values (date'2019-07-13', 2300, 5);
insert into running_log values (date'2019-08-14', 425, 1);
insert into running_log values (date'2019-12-15', 422, 1);
insert into running_log values (date'2020-01-01', 425, 1);
insert into running_log values (date'2020-03-31', 422, 1);
insert into running_log values (date'2020-04-15', 422, 1);
insert into running_log values (date'2020-06-01', 425, 1);
insert into running_log values (date'2020-07-06', 425, 1);
insert into running_log values (date'2021-03-31', 422, 1);
commit;
end;
select * from running_log
理想情况下,我想构建一个表,其中包含第 3 天或更长时间的 begin_date 和少于 3 天的聚合行的聚合数据。下面的代码只做 1 天的间隔,并且不为每个间隔提供 begin_date end_date。
with grps as (
select run_date
, row_number() over (order by run_date) rn ,
run_date - row_number() over (order by run_date) grp_date
from running_log
)
select min(run_date) first_run
, max(run_date) last_run,
count(*) runs,
row_number() over (order by min(run_date)) grp
from grps
group by grp_date
order by min(run_date)
再一次,一行将是 1. 3 天的间隔或 3 天之间的聚合。
【问题讨论】:
-
谢谢 Tinkinc。您使用的是什么数据库版本?