が、私はそれをこのような何かをするだろう...(データとサンプルテーブル変数が含まれています)
DECLARE @TABLE TABLE (ContactID INT, Firstname VARCHAR(55), Lastname VARCHAR(55), Mobile VARCHAR(55));
INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9991234567');
INSERT INTO @TABLE VALUES (2, 'Jhon', 'Wick', '8887654321');
INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9990001111');
INSERT INTO @TABLE VALUES (1, 'Emma', 'Watsan', '9990001111');
SELECT
T1.FirstName + ' ' + T1.LastName AS Name
,T1.Mobile
,MAX(CASE WHEN T2.RowID IS NULL THEN 0 ELSE 1 END) AS Duplicate
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY FirstName,LastName, Mobile) AS RowID
,*
FROM @TABLE
) T1
LEFT JOIN
(
SELECT
ROW_NUMBER() OVER (ORDER BY FirstName,LastName, Mobile) AS RowID
,*
FROM @TABLE
) T2
ON T1.ContactID = T2.ContactID
AND T1.Mobile = T2.Mobile
AND T1.RowID <> T2.RowID
GROUP BY T1.FirstName + ' ' + T1.LastName, T1.Mobile
;
実際のテーブルが既に行番号を持っている場合row_number()
関数をスキップすることができ、その代わりに使用されるテーブルの実際の行IDをスキップすることができます。
ここでの例では、Emma Watsanは同じ番号を2回(意図的に)使用し、別の番号は表に1回だけ表示します。重複した携帯電話番号は(Duplicate = 1
)と表示されますが、他の番号は必要に応じて表示されません。
出典
2017-02-23 08:37:28
3BK
「LEUNT JOIN」がEmma Watsanの最初の行を返して重複して表示するので、これは機能しません。「COUNT(DISTINCT Mobile)> 1」 – Eric