(oracle) SQL 쿼리 질문드립니다..ㅜㅜ 0 4 3,946

by 스큐엘꿈나무 [SQL Query] sql sas oracle [2023.03.21 20:31:19]


안녕하세요. 
SQL을 기초부터 배우고 있는데, 
생각을 해봐도 방법을 잘 몰라서 염치 불구하고 질문을 드립니다.

ID SEX AGE HEIGHT
페이커 25 150
25 151
울프 26 177
바이퍼 28 186
기인 31 145
두두 31 160
예를 들어, ID 제외 중복으로 의심되는 선수를 찾기 위해 

SELECT *
FROM 테이블
GROUP BY SEX,AGE,키
HAVING COUNT(*) >= 2

하면 아무도 나오지 않게 됩니다.(키가 같진 않으니..)

이런 상황에서 성별/나이는 같으며, 키 차이는 중복 선수 중 +-3 값에 해당하면 나오도록...

즉, 페이커와 뱅 선수는 나이,성별이 같고, 키가 +-3cm이내라서 나와야되는데요..

어떤 방향으로 쿼리 짜야될지 잘 몰라서 질문 드립니다..

 

by jkson [2023.03.22 07:58:58]

+-3cm로 그룹을 지을 수는 없을 것 같은데요.

빠른 년생 때문에 4~5살 차이까지도 다 친구가 되는 상황 아시죠?ㅎㅎ 151 기준에서는 154까지 묶을 수 있겠지만 154 기준에서 또 묶어보려면 157까지도 묶을 수 있는 상황이라..

성별과 나이가 같으면서 키가 3cm 이내 차이가 나는 다른 선수가 존재하는 데이터를 뽑는다고 하더라도 중복 선수라는 판단은 쿼리로 하기는 어려울 것 같네요.

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

 


by 스큐엘꿈나무 [2023.03.22 08:30:29]

친절한 답변 감사합니다!

다시 읽어보니 제가 질문을 이상하게 했어요 ㅜㅠ

±3이 아닌, 

성별/나이로 Group by 묶인 친구 "중", 
키 차이가 서로 3cm 이상 차이가 나지 않는 경우에만 다시 Group by로 묶는 경우인데
답변 해주신 것 참고해서 해보도록 하겠습니다. 이른 시간에 감사합니다 !!!
 


by 마농 [2023.03.22 15:58:08]

같은 성별, 나이의 친구가 2명뿐이진 않을 것입니다.
여려명 존재할때 예시와 그에 따른 결과표를 그려보세요.
같은 성별, 나이의 친구 4명의 키가 150, 153, 156, 159 라고 가정했을 때 결과표를 그려보세요.
결과표를 그려보지 않은 상태로 잘문은 모호함만 있습니다.


by 우주민 [2023.03.23 11:37:35]
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를 표시하는 쿼리를 작성해봤습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입