2016-07-25 34 views
0

原始数据与2列:使用标准的单个SQL分组数据(SQL Server)的

0 33 
2 null 
0 44 
2 null 
2 null 
2 null 
0 55 
2 null 
2 null 
..... 

结果我想:

2 33 
2 44 
2 44 
2 44 
2 55 
2 55 
.... 

我可以使用SQL语句来做到这一点? (2返回的行的唯一,但填充值来自上一行是0),可能有许多“2空” 0

+0

你将需要提供第三列它可以用来对事物进行排序,以使给定的零记录可以与一组“NULL”记录相关联。 –

+0

你在哪个DBMS? –

+0

你可以假设有一个Id列,从1开始 – Zhongmin

回答

0

这样

with s as (
    select * 
    from 
    (values 
     (1,0,33 ), 
     (2,2,null), 
     (3,0,44 ), 
     (4,2,null), 
     (5,2,null), 
     (6,2,null), 
     (7,0,55 ), 
     (8,2,null), 
     (9,2,null) 
    ) T(id,a,b) 
) 
select s1.a, t.b 
from s s1 
cross apply ( 
    select top(1) s2.b 
    from s s2 
    where s2.id < s1.id and s2.b is not null and s2.a = 0 
    order by s2.id desc) t 
where s1.a = 2 
order by s1.id; 

我使用交叉适用,所以之间该查询可以很容易地扩展到从相关的'0'行获取其他列。

0

首先,用空的每一行选择值:

SELECT col2 FROM (SELECT MAX(ID) FROM your_tbl t WHERE t.ID < ID AND col2 IS NOT NULL); 

然后写一个条件与子查询的表:

SELECT col1, (
    SELECT col2 FROM your_tbl where id = (SELECT MAX(ID) FROM your_tbl t 
    WHERE t.ID < tbl.ID AND col2 IS NOT NULL)) 
FROM your_tbl tbl WHERE col1 <> 0;