3

こんにちは、これが T-SQL でも可能かどうか疑問に思います。

行 2 と 3 / 行 5 と 6 の組み合わせが存在する場合、行 1 と行 4 のような行を「返さない」という考え方です。

declare @table table
(
 A int,
 B char(2),
 C char(2),
 D char(2)
)

insert into @table
select 2, 'A1', 'B1', NULL  -- row 1
union
select 2, 'A1', 'B1', 'C1'  -- row 2 and row 3 is a combination (values are equal) 
union                       
select 3, 'A1', 'B1', 'C1'   
union
select 2, 'A2', 'B2', NULL  -- row 4
union
select 2, 'A2', 'B2', 'C2'  -- row 5 and row 6 is a combination (values are equal) 
union                     
select 3, 'A2', 'B2', 'C2'   

これを試してみたい人はいますか?よろしくお願いします スティーブ

4

4 に答える 4

2

このようなもの?

declare @table table
(
 ID INT ,
 A int,
 B char(2),
 C char(2),
 D char(2)
)

insert into @table
select 1, 2, 'A1', 'B1', NULL  -- row 1
union
select 2, 2, 'A1', 'B1', 'C1'  -- row 2 and row 3 is a combination (values are equal) 
union                       
select 3, 3, 'A1', 'B1', 'C1'   
union
select 4, 2, 'A2', 'B2', NULL  -- row 4
union
select 5, 2, 'A2', 'B2', 'C2'  -- row 5 and row 6 is a combination (values are equal) 
union                     
select 6, 3, 'A2', 'B2', 'C2'

SELECT *
FROM @table t
WHERE EXISTS(SELECT * FROM @table t1 WHERE t.id IN (t1.id + 1, t1.id + 2) 
      AND t.d IS NULL ) 
于 2013-07-04T09:51:52.427 に答える
2

NOT EXISTS行く方法です:

SELECT A,B,C,D from @table t1
WHERE NOT EXISTS(
    SELECT 1 FROM @table t2
    WHERE t1.A < t2.A 
    AND COALESCE(t1.B,'')=COALESCE(t2.B,'') 
    AND COALESCE(t1.C,'')=COALESCE(t2.C,'') 
    AND COALESCE(t1.D,'')=COALESCE(t2.D,'') 
)

デモ

COALESCE-trick は、2 つの null 値を比較することです。それ以外の場合null=nullは返さnullれ、null 値を持つ等しい行が含まれます。

于 2013-07-04T09:52:10.337 に答える
1

テーブルの集計と順序付けを使用してレコードを個別にフィルタリングすることで、これを取得できると思います。組み合わせを持つ行が続く行を削除したいと思います...もしそうなら、以下の行がうまくいくかもしれません...

declare @table table
(
 A int,
 B char(2),
 C char(2),
 D char(2)
)

insert into @table
select 2, 'A1', 'B1', NULL  -- row 1
union
select 2, 'A1', 'B1', 'C1'  -- row 2 and row 3 is a combination (values are equal) 
union                       
select 3, 'A1', 'B1', 'C1'   
union
select 2, 'A2', 'B2', NULL  -- row 4
union
select 2, 'A2', 'B2', 'C2'  -- row 5 and row 6 is a combination (values are equal) 
union                     
select 3, 'A2', 'B2', 'C2'   


SELECT 
T.* 
FROM 
@table T
INNER JOIN 
(
    SELECT 
    T1.* 
    FROM
    (
        SELECT 
        ROW_NUMBER() OVER(ORDER BY B,C,D) As RowNumber, 
        MIN(A) AS A,
        B,
        C,
        D,
        COUNT(1) Cnt 
        FROM @TABLE
        GROUP BY B,C,D
    ) T1
    LEFT JOIN
    (
        SELECT 
        ROW_NUMBER() OVER(ORDER BY B,C,D) As RowNumber, 
        MIN(A) AS A,
        B,
        C,
        D,
        COUNT(1) Cnt 
        FROM @TABLE
        GROUP BY B,C,D
    ) T2 ON T2.RowNumber = T1.RowNumber + 1
    WHERE ISNULL(T2.Cnt,0) <= 1
) NonPostDuplicateRows
ON T.B = NonPostDuplicateRows.B
AND T.C = NonPostDuplicateRows.C
AND T.D = NonPostDuplicateRows.D
于 2013-07-04T10:39:08.063 に答える