Исключить строку с нулевым значением с помощью CTE - PullRequest
0 голосов
/ 21 июня 2011

У меня есть некоторые данные как

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, но запись RowIdentifier с тремя порциями не будет отображаться в окончательном выводе, поскольку в столбце данных она равна нулю.

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

Требуется помощь

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

Это простой агрегат после фильтра

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 из исходного набора данных, который был бы более правильным

3             1      3       a3          NULL    1
4             1      4       a3          A3      2   --take this row
0 голосов
/ 21 июня 2011

Попробуйте этот код

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
...