将引导函数应用于第一个值

时间:2019-07-05 00:47:36

标签: sql sql-server lead

所以我使用了Lead函数,它非常适合对第2行和第3行的值进行引导,如下所示

enter image description here

这是在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值。下面我已经预想了我想要的样子。

enter image description here

3 个答案:

答案 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的解决方案非常相似,但是我认为如果逻辑比上面编写的复杂得多,这可能给您带来一点好处。