2016-09-05 2 views
4

ここに入力テーブルがあります。テーブル内の論理的に重複する行を識別する

ID | Player1 | Player2 | Player3 
    =================================== 
    101 | Tom | Dick | Harry 
    102 | Jack | Martin | Anna 
    103 | Harry | Tom | Dick 

ここで、ID 101と103の場合、プレイヤーは基本的には異なる順序で同じです。したがって、重複行として扱う必要があります。

問合せを作成して、重複する行をどうやって識別するのですか? "ID 101とID 103が重複している"ということを返すものがありますか?

答えて

3
/* 
CREATE TABLE myTest 
    (ID INT, 
    Player1 VARCHAR(50), 
    Player2 VARCHAR(50), 
    Player3 VARCHAR(50)); 
GO 

INSERT INTO myTest 
VALUES 
    (101, 'Tom', 'Dick', 'Harry'), 
    (102, 'Jack', 'Martin', 'Anna'), 
    (103, 'Harry', 'Tom', 'Dick'); 
GO 
*/ 
WITH 
    Players AS (
     SELECT 
      ID, 
      Player1 AS Player 
     FROM 
      myTest 
     UNION ALL 
     SELECT 
      ID, 
      Player2 AS Player 
     FROM 
      myTest 
     UNION ALL 
     SELECT 
      ID, 
      Player3 AS Player 
     FROM 
      myTest), 
    PlayersSorted AS (
     SELECT 
      *, 
      ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Player) AS RowNo 
     FROM 
      Players) 
SELECT DISTINCT 
    a.ID 
FROM 
    PlayersSorted a 
JOIN 
    PlayersSorted b 
     ON a.ID <> b.ID 
     AND a.Player = b.Player 
     AND a.RowNo = b.RowNo; 
+0

こんにちはショーン、 複数の重複を識別するために、どのようにコードを変更することができますか? 8行があるとします。 101,102,104は重複している。 105と108は重複しています。独特な休息。 と出力を複製するように3つを指定し、他の2つを複製するようにしたい –

+0

必要なものの例を挙げることはできますか? –

+0

ありがとうございます ID |プレーヤー1 |プレーヤー2 | Player3 ============= 101 |トム|ディック|ハリー: 102 |ジャック|マーティン|アンナ 103 |ハリー|トム|ディック 104 |ディック|トム|ハリー 105 |ディーン| Zoya |マーク 106 |アンナ|ジャック| Martin 107 |リリー|ジェームス|パトリック 出力を与える何か 101,103,104は重複しています と 102,106は重複しています –

0

あなたが次に

Select sub.id, min(sub.name) 
FROM (
    select 
     t.id, 
     CASE 
      WHEN rows.row=1 THEN t.player1+t.player2+t.player3 
      WHEN rows.row=2 THEN t.player2+t.player3+t.player1 
      WHEN rows.row=3 THEN t.player3+t.player1+t.player2 
     END as name 
    from t, 
     (select 1 as row 
      union 
      select 2 as row 
      union 
      select 3 as row) rows) sub 
GROUP by sub.id 

は、あなたがこの

ID concat_names 
1 DickHarryTom 
2 AnnaJackMartin 
3 DickHarryTom 
のようなだけのテーブルを持っている最小値を取得するために3つの値

player1+player2+player3 
player2+player3+player1 
player3+player1+player2 

選択から最小値を見つけるために、IDごとに必要

そして、あなたはこれは動作するはずの重複に

1

を見つけるためconcat_names:

WITH Src AS 
(
    SELECT * FROM (VALUES 
    (101, 'Tom', 'Dick', 'Harry'), 
    (102, 'Jack', 'Martin', 'Anna'), 
    (103, 'Harry', 'Tom', 'Dick'), 
    (104, 'Dick', 'Tom', 'Harry'), 
    (105, 'Anna', 'Martin', 'Jack'), 
    (106, 'Anna', 'Martin', 'Joe') 
    ) T(ID, Player1, Player2, Player3) 
), Numbered AS 
(
    SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) N 
    FROM 
    (
     SELECT ID, 
      CONVERT(nvarchar(MAX), Player1) Player1, 
      CONVERT(nvarchar(MAX), Player2) Player2, 
      CONVERT(nvarchar(MAX), Player3) Player3 
     FROM Src 
    ) T1 
    UNPIVOT 
    (Name FOR Player IN (Player1, Player2, Player3)) PV 
), Grouped AS 
(
    SELECT N1.ID, N2.ID DuplicateID 
    FROM Numbered N1 
    CROSS JOIN Numbered N2 
    GROUP BY N1.ID,N2.ID 
    HAVING SUM(CASE WHEN N1.N=N2.N AND N1.ID!=N2.ID AND N1.Name=N2.Name THEN 1 END)=MAX(N1.N) 
) 
SELECT * 
FROM Grouped 
WHERE ID<DuplicateID 
関連する問題