1 2 3 | 안녕하세요. SQL을 기초부터 배우고 있는데, 생각을 해봐도 방법을 잘 몰라서 염치 불구하고 질문을 드립니다. |
ID | SEX | AGE | HEIGHT |
페이커 | 남 | 25 | 150 |
뱅 | 남 | 25 | 151 |
울프 | 남 | 26 | 177 |
바이퍼 | 남 | 28 | 186 |
기인 | 여 | 31 | 145 |
두두 | 여 | 31 | 160 |
1 2 3 4 5 6 | 예를 들어, ID 제외 중복으로 의심되는 선수를 찾기 위해 SELECT * FROM 테이블 GROUP BY SEX,AGE,키 HAVING COUNT (*) >= 2 |
하면 아무도 나오지 않게 됩니다.(키가 같진 않으니..)
이런 상황에서 성별/나이는 같으며, 키 차이는 중복 선수 중 +-3 값에 해당하면 나오도록...
즉, 페이커와 뱅 선수는 나이,성별이 같고, 키가 +-3cm이내라서 나와야되는데요..
어떤 방향으로 쿼리 짜야될지 잘 몰라서 질문 드립니다..
+-3cm로 그룹을 지을 수는 없을 것 같은데요.
빠른 년생 때문에 4~5살 차이까지도 다 친구가 되는 상황 아시죠?ㅎㅎ 151 기준에서는 154까지 묶을 수 있겠지만 154 기준에서 또 묶어보려면 157까지도 묶을 수 있는 상황이라..
성별과 나이가 같으면서 키가 3cm 이내 차이가 나는 다른 선수가 존재하는 데이터를 뽑는다고 하더라도 중복 선수라는 판단은 쿼리로 하기는 어려울 것 같네요.
1 2 3 4 5 6 7 8 9 10 11 | SELECT * FROM 테이블 t1 WHERE EXISTS ( SELECT 1 FROM 테이블 t2 WHERE t1.SEX = t2.SEX AND t1.AGE = t2.AGE AND ABS (t1.HEIGHT - t2.HEIGHT) <= 3 AND t1.ID <> t2.ID ) ORDER BY SEX, AGE, HEIGHT |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | WITH TABLE_A AS ( SELECT '페이커' AS ID, '남' AS SEX, 25 AS AGE, 150 AS HEIGHT FROM DUAL UNION ALL SELECT '뱅' AS ID, '남' AS SEX, 25 AS AGE, 151 AS HEIGHT FROM DUAL UNION ALL SELECT '울프' AS ID, '남' AS SEX, 25 AS AGE, 177 AS HEIGHT FROM DUAL UNION ALL SELECT '바이퍼' AS ID, '남' AS SEX, 28 AS AGE, 186 AS HEIGHT FROM DUAL UNION ALL SELECT '기인' AS ID, '여' AS SEX, 31 AS AGE, 145 AS HEIGHT FROM DUAL UNION ALL SELECT '두두' AS ID, '여' AS SEX, 31 AS AGE, 160 AS HEIGHT FROM DUAL ) SELECT T1.*, T2.ID AS 동일인의심ID FROM TABLE_A T1 LEFT OUTER JOIN TABLE_A T2 ON T1.SEX = T2.SEX AND T1.AGE = T2.AGE AND T2.HEIGHT BETWEEN T1.HEIGHT - 3 AND T1.HEIGHT + 3 WHERE T1.ID <> T2.ID |
단순히 중복 의심 ID를 찾기 위한 거라면 GROUP 으로 묶을 필요는 없을듯 합니다.
조금 다른 방법으로 원래 ID 와 중복 의심 ID를 표시하는 쿼리를 작성해봤습니다.