Применить ведущую функцию к первому значению - PullRequest
0 голосов
/ 05 июля 2019

Итак, я использовал функцию отведения, и она отлично работает для определения значений строк 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;

Однако я хочу написать код, который автоматически создает строку выше без имени и временного старта, но с конечным временем 1, поскольку это значение временного старта первой строки.Ниже я представил, как я хочу, чтобы это выглядело.

enter image description here

Ответы [ 3 ]

1 голос
/ 05 июля 2019

Если вы сортируете по 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>
0 голосов
/ 05 июля 2019

Это может быть хорошим подходом с точки зрения дублирования кода.Я также полагаю, что вы, вероятно, не знаете, каким будет этот первый 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, но я думаю, что это может дать вам небольшое преимущество, если логика многосложнее, чем вы написали выше.

0 голосов
/ 05 июля 2019

просто добавьте 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
...