我们说我有一张包含这样数据的表格:
|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来获取行,然后运行多个其他较小的查询?
答案 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;