根据多列获取重复行的索引列
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
我需要从下面获取 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