ID V1 V2 V3
A 1 2
A 2 3 가
A 3 5
B 3 1
B 4 2
B 5 3 나
B 6 5
C 2 4
C 3 7
C 4 3 가
위와 같은 테이블에서 아래와 같은 결과를 얻고자 합니다.
<결과>
A 1 2 가
B 3 1 나
C 2 4 가
즉, 같은 Key ID 중에서, V1열에서는 가장 작은 값을 취하도록 하고, V3에서는 null 값이 아닌 값을 취하도록 하는 것입니다(각 key ID 중에 V3는 하나의 값만 가지며 나머지는 모두 null입니다). 즉 V1이 가장 작은 id의 행이 가진 다른 값은 취하고, V3만 null이 아닌 값으로 V3를 취하는 것입니다 (V2열의 값은 V1이 최소인 행의 값을 유지).
고수분께서, V1 에서 가장 작은 값만 취하는 것은 self join으로 가르쳐 주셨는데, 이것도 왠지 그렇게 하면 될 것 같은데, 제가 작성하면 컴이 계속 무한루프만 도네요 ㅜ
도와주세요 ㅠ
감사합니다.
Comment 4
-
찬전
2017.12.05 10:57
WITH a AS(SELECT 'A' AS ID, 1 AS V1, NULL AS V2 UNION ALLSELECT 'A', 2, '가' UNION ALLSELECT 'A', 3, NULL UNION ALLSELECT 'B', 3, NULL UNION ALLSELECT 'B', 4, NULL UNION ALLSELECT 'B', 5, '나' UNION ALLSELECT 'B', 6, NULL UNION ALLSELECT 'C', 2, NULL UNION ALLSELECT 'C', 3, NULL UNION ALLSELECT 'C', 4, '가')SELECT T1.ID, MIN(T1.V1) AS V1, (SELECT V2 FROM a T2 WHERE T1.ID = T2.ID AND V2 IS NOT NULL) AS V2FROM a T1GROUP BY ID미약한 SQL 실력이라,,,더 좋은 쿼리가 있을텐데, 그것은 아랫분이 남겨 주실 겁니다. -
브라미
2017.12.05 11:15
감사합니다. 그런데, 제가 원하는 것은 V1열의 min값을 취하는 것이 아니고, V1이 가장 작은 행의 모든 값을 남기되, V3열만 null이 아닌 값으로 대체하기를 원하는 것입니다 ㅎ
그러려면 아마도 self join이 필요할 것 같습니다.
-
자리비움
2017.12.05 11:33
WITH T1 AS(SELECT ID = 'A', V1 = 1, V2 = 2, V3 = NULL UNION ALLSELECT 'A', 2, 3, '가' UNION ALLSELECT 'A', 3, 5, NULL UNION ALLSELECT 'B', 3, 1, NULL UNION ALLSELECT 'B', 4, 2, NULL UNION ALLSELECT 'B', 5, 3, '나' UNION ALLSELECT 'B', 6, 5, NULL UNION ALLSELECT 'C', 2, 4, NULL UNION ALLSELECT 'C', 3, 7, NULL UNION ALLSELECT 'C', 4, 3, '가')SELECT A.ID, A.V1, A.V2, V3 = (SELECT TOP 1 V3 FROM T1 WHERE ID = B.ID AND V3 IS NOT NULL)FROM T1 AS AINNER JOIN (SELECT ID, V1 = MIN(V1)FROM T1GROUP BY ID) AS B ON B.ID = A.ID AND B.V1 = A.V1추가로 컬럼 1개를 가져오실때는 서브쿼리 쓰시면 됩니다. -
브라미
2017.12.05 12:05
감사합니다, 선생님!
큰 도움이 되었습니다.
서브쿼리라는 좋은 방법이 있었네요!
감사의 말씀 드립니다!!