4

一部のフィールド (キー列など) の値が重複しているすべてのレコードを取得したいと考えています。

私のコード:

CREATE TABLE #TEMP (ID int, Descp varchar(5), Extra varchar(6))
INSERT INTO #Temp
SELECT 1,'One','Extra1'
UNION ALL
SELECT 2,'Two','Extra2'
UNION ALL
SELECT 3,'Three','Extra3'
UNION ALL
SELECT 1,'One','Extra4'

SELECT ID, Descp, Extra FROM #TEMP
;WITH Temp_CTE AS
(SELECT *
 , ROW_NUMBER() OVER (PARTITION BY ID, Descp ORDER BY (SELECT 0)) 
    AS DuplicateRowNumber
    FROM #TEMP
)
SELECT * FROM Temp_cte 
DROP TABLE #TEMP

最後の列は、ID と Descp の値に基づいて、各行が何回出現したかを示しています。その行が必要ですが、ID = 1 と Descp = 'One' の両方の行が複数回表示されていることを示す別の列*も必要です。

したがって、追加の列* (つまり、MultipleOccurances (bool)) は、ID = 1 および Descp = 'One' の 2 つの行に対して 1 を持ち、他の行に対しては 0 を 1 回しか表示しないためです。

どうすればそれを達成できますか?(可能であれば、Count(1)>1 などの使用は避けたいと思います。

編集:

望ましい出力:

ID  Descp   Extra   DuplicateRowNumber  IsMultiple
1   One     Extra1  1                   1
1   One     Extra4  2                   1
2   Two     Extra2  1                   0
3   Three   Extra3  1                   0

SQL フィドル

4

2 に答える 2

6

「カウントは避けたい」とおっしゃっていますが、それが一番いい方法でしょう。すでに持っているパーティショニングを使用しますrow_number

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY ID, Descp 
                              ORDER BY (SELECT 0)) AS DuplicateRowNumber,
       CASE
         WHEN COUNT(*) OVER (PARTITION BY ID, Descp) > 1 THEN 1
         ELSE 0
       END                                         AS IsMultiple
FROM   #Temp 

そして、実行計画は単一の並べ替えを示しているだけです

予定

于 2013-08-05T20:08:23.137 に答える
1

まあ、私はこの解決策を持っていますが、カウントを使用しています...

SELECT T1.*, 
 ROW_NUMBER() OVER (PARTITION BY T1.ID, T1.Descp ORDER BY (SELECT 0))  AS DuplicateRowNumber,
 CASE WHEN T2.C = 1 THEN 0 ELSE 1 END MultipleOcurrences  FROM #temp T1
 INNER JOIN 
  (SELECT ID, Descp, COUNT(1) C FROM #TEMP GROUP BY ID, Descp) T2
  ON T1.ID = T2.ID AND T1.Descp = T2.Descp
于 2013-08-05T20:05:19.890 に答える