重复计数-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…:)