2017-11-30 3 views
0

にGROUP BYを持つ2つのテーブルを結合するための重複を避け、私はテーブルは、そのうちの一つが、そのうちの一つは、SQLサーバー上のSQL Server</p> <p>にGROUP BYを持つ2つのテーブルを結合するための重複を避けSQLサーバー

を持っています
Id1, id2, id3, val1, val2 
1  15 20 110 25.69 
1  15 20 120 26.17 
2  19 58 110 17.11 
3  66 75 129 9.55  
3  66 75 268 66.82 

val1が複数の異なる値を持つすべての行を見つける必要があります。

予想される出力は次のようになります。

Id1, id2, id3, val1, val2 
1  15 20 110 25.69 
1  15 20 120 26.17 
3  66 75 129 9.55  
3  66 75 268 66.82 

ので、同じ

Id1, id2, id3 

のために、彼らは "VAL1" に複数の値を持っています。

私はこれでそれを行う方法を知っている:

Id1, id2, id3 
    1  15 20 

は私にはない

Id1, id2, id3, val1, val2 
1  15 20 110 25.69 
1  15 20 120 26.17 
1  15 20 110 25.69 
1  15 20 120 26.17 

を得るに接合することができるので、これは行が重複している可能性があり、

SELECT Id1, id2, id3, val1, val2 
FROM table1 AS a 
INNER JOIN 
(
    SELECT Id1, id2, id3 
    FROM table 1 
    GROUP BY Id1, id2, id3 
    HAVING COUNT(DISTINCT val1) > 1 
) AS b 
ON a.id1 = b.id1 and a.id2 = b.id2 and a.id3 = b.id3 

しかし、浮動小数点数に "distinct"を使いたい。

クエリを改善するにはどうすればよいですか? サブクエリを使用せずに実行できますか?

答えて

0

私は、ウィンドウ関数を使用します。

select Id1, id2, id3, val1, val2 
from (select t1.*, 
      min(val1) over (partition by id1, id2, id3) as min1, 
      max(val1) over (partition by id1, id2, id3) as max1 
     from t1 
    ) t1 
where min1 <> max1; 
+0

2つ以上のval1の異なる値がある場合はどうなりますか? thx – user3448011

+0

@ user3448011 。 。 3つ以上の 'val1'個以上の値がある場合、最小値と最大値は依然として異なっているので、ロジックが機能します。 –

+0

これはmin(val1)以上(パーティションid1、id2、id3)である必要がありますか? – user3448011

0

あなたはWHERE EXISTSを使用することができます。

DECLARE @tablename TABLE (Id1 int, id2 int, id3 int, val1 int, val2 decimal(16,2)) 
INSERT INTO @tablename VALUES 
(1, 15, 20, 110, 25.69) 
,(1, 15, 20, 120, 26.17) 
,(2, 19, 58, 110, 17.11) 
,(3, 66, 75, 129, 9.55) 
,(3, 66, 75, 268, 66.82) 

SELECT * 
    FROM @tablename T1 
WHERE EXISTS (SELECT * 
       FROM @tablename T2 
       WHERE T2.Id1 = T1.Id1 
        AND T2.id2 = T1.id2 
        AND T2.id3 = T1.id3 
        AND T2.val1 <> T1.val1) 

は出力を生成します。

Id1 id2 id3 val1 val2 
1 15 20 110 25.69 
1 15 20 120 26.17 
3 66 75 129 9.55 
3 66 75 268 66.82 
0

これはVAL1のすべての繰り返しを見つけて、すべて削除されますが、最初の結果:

select * 
from (
    select * 
     , row_number() over(partition by val1 
          order by (select null)) rn 
    from yourtable 
    ) d 
where rn = 1 
関連する問題