我正在尝试计算SQL Server中另一列上分组的两列上的重复值的数量。
以下是我正在处理的示例方案。
DECLARE @mytable TABLE (CampName varchar(10),ID VARCHAR(10),ListName varchar(10))
INSERT INTO @mytable
( CampName, ID, ListName )
VALUES ( 'A', 'X', 'Y' ), ( 'A', 'X', 'Y' ),
( 'A', 'Y', 'Z' ), ( 'A', 'Y', 'Z' ),
( 'A', 'Y', 'Z' ), ( 'A', 'P', 'Q' ),
( 'B', 'X', 'Y' ), ( 'B', 'X', 'Y' ),
( 'B', 'Y', 'Z' ), ( 'B', 'Y', 'Z' ),
( 'B', 'Y', 'Z' ), ( 'B', 'P', 'Q' ),
( 'B', 'R', 'S' ), ( 'B', 'R', 'S' )
这将产生下表。
CampName ID ListName
-------------------------------------
A X Y
A X Y -- Duplicate Record
A Y Z
A Y Z -- Duplicate Record
A Y Z -- Duplicate Record
A P Q
B X Y
B X Y -- Duplicate Record
B Y Z
B Y Z -- Duplicate Record
B Y Z -- Duplicate Record
B P Q
B R S
B R S -- Duplicate Record
我需要输出如下:
CampName dupcount
-------------------
A 3
B 4
基本上,我需要计算每个CampName的重复数(ID,ListName),而不管重复值是什么。
如果我能澄清这方面的其他内容,请告诉我。 任何帮助将不胜感激。
答案 0 :(得分:9)
您可以使用以下查询:
SELECT CampName, SUM(cnt) AS dupcount
FROM (
SELECT CampName, COUNT(*) - 1 AS cnt
FROM @mytable
GROUP BY CampName, ID, ListName
HAVING COUNT(*) > 1) AS t
GROUP BY CampName
内部查询使用HAVING
子句过滤掉非重复条目。它还计算每ID, ListName
个重复记录的数量。外部查询只是对重复数进行求和。
答案 1 :(得分:5)
这是获得所需结果的简单方法:
select t.campname, count(*) - count(distinct t.listname) as num_duplicates
from @mytable t
group by t.campname;
逻辑是count(*)
计算所有行。 count(distinct)
计算不同列表的数量。差异是重复的数量。
编辑:
Giorgios提出了一个很好的观点。但是,数据看起来像id
,而name
包含相同的信息,因此似乎只需要一个。如果您必须同时使用这两个数据库,那么您可以执行以下操作:
select t.campname, count(*) - count(distinct t.id, t.listname) as num_duplicates
from @mytable t
group by t.campname;
但不是SQL Server。相反,将它们连接在一起:
select t.campname,
count(*) - count(distinct concat(t.id, ':', t.listname)) as num_duplicates
from @mytable t
group by t.campname;
答案 2 :(得分:5)
我认为需要从每个ID
组的总计数中减去ListName
和 CampName
的不同数量的组合才能获得正确的结果
SELECT t.CampName,
COUNT(*) - COUNT(DISTINCT 'ColOne' + ID + 'ColTwo' + ListName) AS dupcount
FROM yourTable t
GROUP BY CampName
此查询使用一种技巧,即连接ID
和ListName
列(均为文本),以有效地形成伪组。这需要DISTINCT
仅适用于单个列,但您需要考虑两列。
参考: Quora: In SQL, how to I count DISTINCT over multiple columns?
答案 3 :(得分:4)
这个问题有点模糊。
如果您认为所有ID
和ListName
组合始终相同,则以下查询适用于您:
您可以使用DISTINCT
COUNT
来执行此操作
SELECT CampName, COUNT(DISTINCT ListName) UniqueCount
FROM @mytable
GROUP BY CampName
如果您怀疑,组合可能不会始终相等,则需要考虑计算ID
和ListName
列的组合。
这假定了一个不存在的并置运算符
|
这两列中的任何一列。
SELECT CampName, COUNT(DISTINCT ID+'|'+ListName) UniqueCount
FROM @mytable
GROUP BY CampName
如果您担心计算重复的行数
SELECT CampName, COUNT(*) - COUNT(DISTINCT ID+'|'+ListName) dupCount
FROM @mytable
GROUP BY CampName
另一种选择,我认为
;WITH Temp AS
(
SELECT CampName, ID, ListName, COUNT(*) UniqueCount
FROM @mytable
GROUP BY CampName, ID, ListName
)
SELECT CampName, COUNT(UniqueCount) count
FROM Temp
GROUP BY CampName
答案 4 :(得分:3)
你也可以用CONCAT检索相同的结果,它更可靠
binaer += "1"
答案 5 :(得分:2)
尝试这样的事情,分析SELECT语句,WITH子句对逻辑并不重要:
WITH input_data AS (
SELECT 'X' AS x, 'Y' AS y FROM DUAL
UNION ALL
SELECT 'X' AS x, 'Y' AS y FROM DUAL
UNION ALL
SELECT 'X' AS x, 'A' AS y FROM DUAL
)
SELECT input_data.*, COUNT(*) OVER (PARTITION BY x, y) - 1 AS numer_duplicates
FROM input_data
;