用前一行其他列填充一列

时间:2018-04-13 16:06:10

标签: sql

我们说我有一张包含这样数据的表格:

|start|stop|name
|-----|----|----
|1    |NULL|John
|5    |7   |John
|9    |13  |John
|22   |NULL|John
|34   |NULL|John
|65   |69  |John
|74   |NULL|John

使用下一行的起始值填充空值('停止')的最简单方法是:

|start|stop|name
|-----|----|----
|1    |5   |John
|5    |7   |John
|9    |13  |John
|22   |34  |John
|34   |65  |John
|65   |69  |John
|74   |NULL|John

我可以只使用查询吗?或者我是否必须使用PHP来获取行,然后运行多个其他较小的查询?

4 个答案:

答案 0 :(得分:0)

在您的选择

中使用此功能
select start, case when stop is null then lead(start,1,null) over(order by start) else stop end...... 

答案 1 :(得分:0)

- 尝试此查询。您可以在SQL

中以多种方式执行此操作
create table #table1 (startid int, stopid int, tname varchar(20))
insert into #table1 values
 (1 ,NULL,'John')
 ,(5 ,7   ,'John')
 ,(9 ,13  ,'John')
 ,(22,NULL,'John')
 ,(34,NULL,'John')
 ,(65,69  ,'John')
 ,(74,NULL,'John')

 select * from #table1
 select t.startid, nullif(isnull(t.stopid, t.Newvalue),0)stopid
 from(
 select *,LEAD(startid, 1,0) OVER (ORDER BY startid) AS Newvalue
 from #table1
 )t

答案 2 :(得分:0)

使用lead()coalesce()

select start,
       coalesce(stop, lead(start) over (partition by name order by start)) as stop,
       name
from t;

答案 3 :(得分:0)

由于您没有标记任何DBMS,我只会使用subquery与关联方法

select start, coalesce(stop,  
              (select top 1 start from table where start > t.start and name = t.name 
                                  order by start)) as stop, 
        name
from table t;