我有以下表结构
Columns: ID, FKID, NAME, TYPE1, TYPE2, TYPE3
我正在尝试在ORACLE中编写一个SQL脚本来按ID计算重复记录。如果TYPE1在任何地方都相同,这很简单,但重复值可以在TYPE1,TYPE2或TYPE3中 - 例如,以下两行应作为重复行返回:
ID: 1, FKID: 1, NAME: Example1, TYPE1: 01, TYPE2: 02, TYPE3: 03
ID: 1, FKID: 1, NAME: Example2, TYPE1: 02, TYPE2: 03, TYPE3: 01
答案 0 :(得分:0)
SELECT *
FROM tableName
WHERE ID IN (
SELECT ID FROM
(
SELECT ID
ROW_NUMBER() OVER( PARTITION BY ID ORDER BY TYPE1, TYPE2, TYPE3) as seqNum
FROM tableName
) Z
WHERE seqNum>1
)
<强>解释强>
如果任何列TYPE1,TYPE2或TYPE3具有不同的值, ROW_NUMBER() OVER( PARTITION BY ID ORDER BY TYPE1, TYPE2, TYPE3)
将为行生成不同的序列号 seqNum 。
答案 1 :(得分:0)
以下查询执行自连接,并将TYPE1,TYPE2和TYPE3与其他行的TYPE1,TYPE2和TYPE3匹配。如果匹配,则选择该行,最后,通过分组获得每个ID的行数。
SELECT mt1.ID, COUNT(mt1.ID)
FROM mytable mt1
INNER JOIN mytable mt2
ON mt1.ID = mt2.ID AND (mt1.TYPE1 = mt2.TYPE1 OR mt1.TYPE1 = mt2.TYPE2 OR mt1.TYPE1 = mt2.TYPE3 OR mt1.TYPE2 = mt2.TYPE2 OR mt1.TYPE2 = mt2.TYPE3 OR mt1.TYPE3 = mt2.TYPE3)
AND mt1.NAME <> mt2.NAME
GROUP BY mt1.ID;