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' 的两行有 1,对于其他行有 0,因为它们只显示一次。

我怎样才能做到这一点?(如果可能,我想避免使用 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

您说“我想避免使用 Count”,但这可能是最好的方法。它使用您在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 回答