ID | visit | vars_1 | vars_2 | vars_3 |
TEST_1 | D1 | 1 | 2 | 3 |
TEST_1 | D2 | 1 | 2 | 3 |
TEST_1 | D3 | 1 | 2 | 3 |
TEST_1 | D8 | 1 | 2 | 3 |
TEST_2 | D1 | 2 | 3 | 4 |
TEST_2 | D2 | 2 | 3 | 4 |
TEST_2 | D3 | 2 | 3 | 4 |
TEST_2 | D8 | 2 | 3 | 4 |
TEST_3 | D1 | 3 | 4 | 5 |
TEST_3 | D2 | 3 | 4 | 5 |
TEST_3 | D3 | 3 | 4 | 5 |
TEST_3 | D8 | 3 | 4 | 5 |
위 데이터를 다음과 같이 조회하여야 합니다. 현재는 LEFT OUTER JOIN 으로 사용하고 있는데, 다른 방법이 없는지 해서 질문게시판에 올리게 되었습니다.
현재 조건은 아이디별로 한 행에 변수 값의 D1, D2가 나오도록 하는 코드입니다.
WITH TEST_TBL(id, visit, vars_1, vars_2, vars_3) as
(
SELECT 'TEST_1', 'D1', '1', '2', '3' Union ALL
SELECT 'TEST_1', 'D2', '1', '2', '3' Union ALL
SELECT 'TEST_1', 'D3', '1', '2', '3' Union ALL
SELECT 'TEST_1', 'D8', '1', '2', '3' Union ALL
SELECT 'TEST_2', 'D1', '2', '3', '4' Union ALL
SELECT 'TEST_2', 'D2', '2', '3', '4' Union ALL
SELECT 'TEST_2', 'D3', '2', '3', '4' Union ALL
SELECT 'TEST_2', 'D8', '2', '3', '4' Union ALL
SELECT 'TEST_3', 'D1', '3', '4', '5' Union ALL
SELECT 'TEST_3', 'D2', '3', '4', '5' Union ALL
SELECT 'TEST_3', 'D3', '3', '4', '5' Union ALL
SELECT 'TEST_3', 'D8', '3', '4', '5'
) SELECT
a.id as 'id_D1'
, b.id as 'id_D2'
, a.visit as 'visit_D1'
, b.visit as 'visit_D2'
, a.vars_1 as 'vars_1_D1'
, b.vars_1 as 'vars_1_D2'
, a.vars_2 as 'vars_2_D1'
, b.vars_2 as 'vars_2_D2'
FROM TEST_TBL as a
LEFT OUTER JOIN TEST_TBL as b
ON a.id = b.id and b.visit = 'D2'
WHERE a.visit = 'D1'
Comment 7
-
루디먼트
2015.10.07 12:11
select *from (selectid as id_D1,LAG(id, 1, null) over(partition by id order by visit) as id_D2,visit as visit_D1,LAG(visit, 1, null) over(partition by id order by visit) as visit_D2,vars_1 as vars_1_D1,LAG(vars_1, 1, null) over(partition by id order by visit) as vars_1_D2,vars_2 as vars_2_D1,LAG(vars_2, 1, null) over(partition by id order by visit) as vars_2_D2from TEST_TBLwhere visit in ('D1','D2')) as awhere id_D2 is not null -
루디먼트
2015.10.07 12:19
1. 원문 글의 성능
테이블 '#TEST_TBL'. 검색 수 2, 논리적 읽기 수 4, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
SQL Server 실행 시간:
CPU 시간 = 0ms, 경과 시간 = 50ms
SQL Server 구문 분석 및 컴파일 시간:
CPU 시간 = 0ms, 경과 시간 = 0ms.
2. 윈도우 함수 성능
테이블 'Worktable'. 검색 수 0, 논리적 읽기 수 0, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
테이블 '#TEST_TBL'. 검색 수 1, 논리적 읽기 수 1, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.
SQL Server 실행 시간:
CPU 시간 = 0ms, 경과 시간 = 21ms
SQL Server 구문 분석 및 컴파일 시간:
CPU 시간 = 0ms, 경과 시간 = 0ms.
-
Gusto
2015.10.07 13:37
답변 고맙습니다. LAG 함수 사용은 생각을 못하고 PIVOT 으로 해보려고 했었는데 이렇게 사용방법을 알아가네요.
-
건우아빠
2015.10.07 13:23
다른 방법적인 측면만 성능은 고려 하지 않음. ㅋㅋ
SELECT MAX( case when visit = 'D1' then id end) 'id_D1'
, MAX( case when visit = 'D2' then id end) 'id_D2'
, MAX( case when visit = 'D1' then visit end) 'visit_D1'
, MAX( case when visit = 'D2' then visit end) 'visit_D2'
, MAX( case when visit = 'D1' then vars_1 end) 'vars_1_D1'
, MAX( case when visit = 'D2' then vars_1 end) 'vars_1_D2'
, MAX( case when visit = 'D1' then vars_2 end) 'vars_2_D1'
, MAX( case when visit = 'D2' then vars_2 end) 'vars_2_D2'
FROM TEST_TBL a
WHERE a.visit in ( 'D1' , 'D2')
GROUP BY a.ID -
Gusto
2015.10.07 14:00
답변 고맙습니다!
-
minsouk
2015.10.08 23:06
제가 보기엔 건우형님께 젤 빨라 보이는데...... 술은 언제 사주시나요? 쿨럭~
-
건우아빠
2015.10.08 23:35
다음 16일 불금으로 할까.... ?