私は重複を削除する問題を抱えています。ここで重複を作成するのは、例をあげて下に示します。
idが異なる列にある重複を削除するにはどうすればよいですか?
EmployeeID IDnr1 IDnr2
123456 111111 222222
123456 222222 111111
私はこれらの行のいずれかを削除したいです。誰に関係なく。 私は、このような重複した行が数千件あります。
ありがとうございます。
私は重複を削除する問題を抱えています。ここで重複を作成するのは、例をあげて下に示します。
idが異なる列にある重複を削除するにはどうすればよいですか?
EmployeeID IDnr1 IDnr2
123456 111111 222222
123456 222222 111111
私はこれらの行のいずれかを削除したいです。誰に関係なく。 私は、このような重複した行が数千件あります。
ありがとうございます。
GROUP BY
句にCASE
という表現を使用してください。それを行うには
クエリ
select [EmployeeID], min([IDnr1]) [IDnr1], max([IDnr2]) [IDnr2]
from [your_table_name]
group by [EmployeeID],
case when [IDnr1] > [IDnr2] then [IDnr1] else [IDnr2] end,
case when [IDnr1] > [IDnr2] then [IDnr2] else [IDnr1] end;
パーフェクト。これはうまくいった。ありがとう:D – torbol
一つの方法は、row_number()
でCTEを使用しています。
;WITH CTE AS
(
SELECT EmployeeID,
ROW_NUMBER() OVER(PARTITION BY EmployeeID,
CASE WHEN IDnr1 < IDnr2 THEN IDnr1 ELSE IDnr2 END,
CASE WHEN IDnr1 < IDnr2 THEN IDnr2 ELSE IDnr1 END
ORDER BY (SELECT NULL)) rn
FROM @T
)
:最小値を取得するために例の使用を注意してください -
(私たちを保存します将来の質問では、このステップください)CTEは
DECLARE @T AS TABLE
(
EmployeeID int,
IDnr1 int,
IDnr2 int
)
INSERT INTO @T VALUES
(123456, 111111, 222222),
(123456, 222222, 111111),
(123456, 111112, 222222),
(123457, 222222, 111111)
をサンプルテーブルを作成し、移入削除ステートメント:
DELETE
FROM CTE
WHERE rn > 1
ただし、重複を削除することは、作業の一部に過ぎません。新しい複製をテーブルに挿入できないようにしたいとします。これを行うには、テーブルにチェック制約を追加する必要がありますが、まずテーブルを更新します。 このステップは必ずチェック制約を追加することができようになります。
UPDATE TableName
SET Idnr1 = Idnr2,
Idnr2 = Idnr1
WHERE Idnr1 >= Idnr2
すると、チェック制約を追加します。これは、新しい重複があなたのテーブルに挿入することはできないことを確認します
ALTER TABLE TableName
ADD CONSTRAINT CK_TableNamePreventDups CHECK(Idnr1 < Idnr2)
GO
を。
最終的に重複はありません。異なる列にあり、異なる値を持っています。 –