2011-06-21 55 views
0

我有一些數據,消除有使用CTE

RowIdentifier ID RowID Position Data Rn 
1    1  1  a1   A1  1 
2    1  2  a2   A2  1 
3    1  3  a3   NULL 1 
4    1  4  a3   A3  2 
5    1  1  b1   B1  1 
6    1  2  b2   NULL 1 
7    1  3  b2   B2  2 
8    1  4  b3   B3  1 

所需的輸出是

ID RowID Position Data 
1  1  a1  A1 
1  1  b1  B1 
1  2  a2  A2 
1  2  b2  B2 
1  3  a3  A3 
1  3  b3  B3 

我需要清除這些地方的位置被重複行空值的行和其數據爲空。即在示例中,在RowIdentifier 3和4中,Position列中的值爲a3,但thIdIndIdentifier記錄不會出現在最終輸出中,因爲它在Data列中爲null。

的DDL是在

Declare @t table(RowIdentifier int identity,ID int,RowID int,Position varchar(10),Data varchar(10),Rn int) 
    Insert into @t 
    Select 1,1,'a1','A1',1 union all 
    Select 1,2,'a2','A2',1 union all 
    Select 1,3,'a3',null,1 union all 
    Select 1,4,'a3','A3',2 union all 
    Select 1,1,'b1','B1',1 union all 
    Select 1,2,'b2',null,1 union all 
    Select 1,3,'b2','B2',2 union all 
    Select 1,4,'b3','B3',1 

    Select * from @t 

我的做法是在

;with cte as(
Select ID,RowID,Position,Position as p2,Data,RowIdentifier from @t 
union all 
select c4.ID,c4.RowID,c4.Position,c5.Position , c4.Data,c4.RowIdentifier 
from cte c5 
join @t c4 on c4.Position = c5.Position 
where c5.RowIdentifier < c4.RowIdentifier 
) 
, 
cte2 as(
select * , rn = Row_Number() over(PARTITION by position order by RowIdentifier) 
from cte where Data is not null) 

select ID,RowID,Position,Data from cte2 where rn =1 

但不工作按預期的輸出。我的輸出是

ID RowID Position Data 
1 1 a1 A1 
1 2 a2 A2 
1 4 a3 A3 
1 1 b1 B1 
1 3 b2 B2 
1 4 b3 B3 

幫助需要

感謝

+0

當遞歸調用CTE時,您需要終止條件。即'WHERE something Johan

+0

我已經更新了我的查詢,但輸出結果並不像預期的那樣儘管我很接近...如果你能指出我的查詢中的錯誤 – aditi

+0

爲什麼你想讓「RowID」無關到原來的RowID?它應該是不同的列名稱,並且RowID不應位於輸出中。這是誤導 – gbn

回答

0

試試這個代碼

Select 
    ID, 
    dense_rank() over(order by substring(data,2,len(data))*1) as rowid, 
    position, 
    data 
from 
    @t 
where 
    data is not null 
group by 
    ID,RowID,position,data 
0

這是一個過濾器

SELECT 
    ID, MIN(RowID) AS RowID, POSITION, Data 
FROM 
    @t 
WHERE 
    Data IS NOT NULL 
GROUP BY 
    ID, RowID, POSITION, Data 
ORDER BY 
    POSITION, RowID 

經過簡單彙總這從個保留的RowID e原始數據集將更加正確

3    1  3  a3   NULL 1 
4    1  4  a3   A3  2 --take this row 
+0

如果我正確理解問題,如果結果集中具有相同「位置」值的結果集中已經存在非空值,我們只想省略空值 – Tao

+0

@Tao:此情況下無樣本數據。根據我們所知道的,可以合理地假設NULL只在發生重複的地方纔會發生...... – gbn