重复计数-TSQL

重复计数-TSQL,sql,sql-server,sql-server-2008,tsql,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 I

我希望获取某些字段(即键列)具有重复值的所有记录

我的代码:

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'的两行都出现了不止一次

因此,有一个额外的列*(即multipleoccurrences(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

好吧,我有这个解决方案,但是使用计数

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
您说“我想避免使用Count”,但这可能是最好的方法。它使用您在
行编号上已有的分区

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 
执行计划只显示了一个排序


你的意思是“另一列”而不是“另一行”?你能显示你想要的实际输出,而不是试图用一个词来描述它吗?是的,还有一列…对不起。更新了行>列和所需的输出。为什么你不喜欢
count(1)>1
?当count(1)超过时添加
大小写(按ID划分,Descp)>1,然后1,否则0结束IsMultiple
以选择您的cte列表。有什么更简单的方法吗?您是对的…”我不知道“计数”和“超过(标准杆…”可以一起去。学到了一些新东西…干杯!!!感谢Ricardo的支持。我喜欢你的代码,但另一个代码看起来更简单,所以我会将其标记为答案…再次使用thx。这非常好。感谢额外的执行计划更新。我将使用COUNT…:)