'get index column of duplicate rows based on multiple columns
I need to get ID and person name from the below table where address1, address2, state, city, country columns have same data for all the roles.
| 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 |
I want output as
| ID | Name |
|---|---|
| 1 | AB |
| 3 | CD |
select ID, Name, count(*) from person group by address1,address2,city,state having count(*) > 1;
which is giving the exception : not a group by expression.
Please suggest a better approach to achieve about output.
Solution 1:[1]
You can use analytic functions:
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;
Which, for the sample data:
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;
Outputs:
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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | MT0 |
