根据多列获取重复行的索引列

get index column of duplicate rows based on multiple columns

我需要从下面获取 ID 和人名 table,其中地址 1、地址 2、州、城市、国家/地区列对所有角色具有相同的数据。

ID Name Address1 Address2 State City
1 AB AB@123 AB@345 st1 ct1
2 AB AB@123 AB@345 st1 ct1
3 CD AB@123 AB@345 st1 ct1
4 EF EF@123 AB@345 st1 ct1

我想要输出为

ID Name
1 AB
3 CD

select ID, Name, count(*) from person group by address1,address2,city,state having count(*) > 1;

给出异常:不是按表达式分组。

请提出一个更好的方法来实现输出。

您可以使用解析函数:

SELECT ID, Name, Address1, Address2, State, City
FROM   (
  SELECT p.*,
         COUNT(DISTINCT Name) OVER (PARTITION BY Address1, Address2, State, City)
           AS cnt,
         ROW_NUMBER() OVER (
           PARTITION BY Address1, Address2, State, City, Name
           ORDER BY id
         ) AS rn
  FROM   person p
)
WHERE  cnt > 1
AND    rn = 1;

其中,对于示例数据:

CREATE TABLE person (ID, Name, Address1, Address2, State, City) AS
SELECT 1, 'AB', 'AB@123', 'AB@345', 'st1', 'ct1' FROM DUAL UNION ALL
SELECT 2, 'AB', 'AB@123', 'AB@345', 'st1', 'ct1' FROM DUAL UNION ALL
SELECT 3, 'CD', 'AB@123', 'AB@345', 'st1', 'ct1' FROM DUAL UNION ALL
SELECT 4, 'EF', 'EF@123', 'AB@345', 'st1', 'ct1' FROM DUAL;

输出:

ID NAME ADDRESS1 ADDRESS2 STATE CITY
1 AB AB@123 AB@345 st1 ct1
3 CD AB@123 AB@345 st1 ct1

db<>fiddle here