所以我使用了Lead函数,它非常适合对第2行和第3行的值进行引导,如下所示
这是在sql中生成该表的代码。
drop table timetable;
create table timetable(
names varchar(50),
timestart integer
);
insert into timetable values ('NAV',1);
insert into timetable values ('Jim',2);
insert into timetable values ('MIC',3);
select names
,timestart
, Lead(timestart) Over (order by timestart) as endtime
from timetable;
但是,我想编写一个代码,在上面自动创建一个没有名称,没有timestart但结束时间为1的行,因为那是第一行的timestart值。下面我已经预想了我想要的样子。
答案 0 :(得分:1)
假设您按timestart
进行排序,则可以执行以下操作:
select *
from (
select
names,
timestart,
lead(timestart) over (order by timestart) as endtime
from timetable
union all
select null, null, min(timestart) from timetable
) x
order by case when timestart is null then 0 else 1 end, timestart
结果:
names timestart endtime
------ --------- -------
<null> <null> 1
NAV 1 2
Jim 2 3
MIC 3 <null>
答案 1 :(得分:0)
只需将union all
添加到您的查询中
select names
,timestart
,Lead(timestart) Over (order by timestart) as endtime
from timetable
union all
select null
,null
,min(timestart)
from timetable
order by timestart
答案 2 :(得分:0)
从代码复制的角度来看,这可能是一个好方法。我也认为您可能不知道第一个timestart
会是什么。使用此方法的方法是将主查询放入内部CTE。然后,在新行中添加从该数据集中复制的timestart
值。
with q as ( -- your real query here
select names, timestart, endtime,
from timetable ...
)
select null as names, null as timestart, min(timestart) as endtime from q
union all
select names, timestart, endtime from q
order by timestart;
这与The Impaler的解决方案非常相似,但是我认为如果逻辑比上面编写的复杂得多,这可能给您带来一点好处。