重复计数 - SQL

时间:2013-08-05 19:51:56

标签: sql sql-server sql-server-2008 tsql

我想获取所有具有一些字段重复值的记录(即键列)。

我的代码:

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的两行为1,Descp为'One',其他行为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 Fiddle

2 个答案:

答案 0 :(得分:5)

你说“我想避免使用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 

执行计划只显示一种

plan

答案 1 :(得分:1)

好吧,我有这个解决方案,但是使用Count ...

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