재귀쿼리를 응용한 Lag 함수 쿼리 질문 0 2 920

by 잭키올 [SQL Query] [2017.12.29 05:00:20]


1122.PNG (25,201Bytes)

안녕하세요.
재귀쿼리를 사용하다가 Lag 함수를 라는 것을 알게 되어서
Lag 함수를 질문을 드리게 되어 글을 작성하게 되었습니다.

Lag 함수를 사용하니 상당히 편하다는 것을 느낄 수 있었는데요.

아래와 같은 단순한 예제에서도 Lag 함수 만으로 결과값이 뽑힐 수 있는지 궁금해서 질문 드립니다.
일반적으로는 재귀쿼리로 완성이 가능할 것 같으나 LAG 함수를 이용하여 할 수도 있겠다는 생각이 들었습니다.
Lag 함수로도 충분히 가능할 것 같은데.. 제가 생각을 못하는거 같아 고수님들께 질문 드립니다.

 

DROP TABLE PRAC.DBO.TB_AD_OPER_PLAN
CREATE TABLE PRAC.DBO.TB_AD_OPER_PLAN
( OPER_CD  NVARCHAR(50)
, PLANT_CD NVARCHAR(50)
, CLASS    NVARCHAR(50)
)
INSERT INTO PRAC.DBO.TB_AD_OPER_PLAN
SELECT 'O_001' AS [OPER_CD], 'P001' AS [PLANT_CD], 'A' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P001' AS [PLANT_CD], 'B' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P001' AS [PLANT_CD], 'C' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'A' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'B' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'C' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'D' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'E' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'F' AS [CLASS_ID]  UNION ALL
SELECT 'O_001' AS [OPER_CD], 'P002' AS [PLANT_CD], 'G' AS [CLASS_ID] 

 

* SSMS 2014

by 마농 [2017.12.29 08:05:25]
SELECT oper_cd
     , plant_cd
     , class_id
     , STUFF((SELECT '-' + class_id
                FROM tb_ad_oper_plan
               WHERE oper_cd   = a.oper_cd
                 AND plant_cd  = a.plant_cd
                 AND class_id <= a.class_id
               ORDER BY class_id
                 FOR XML PATH('')
              ), 1, 1, '') map_class_id
  FROM tb_ad_oper_plan a
;

 


by 잭키올 [2017.12.29 17:27:21]

감사합니다, 마농님

xml path 를 이용하여 이런 쿼리를 짤 수 있다는 것을 답변 해주신거 보고 검색해보면서 알게 되었습니다. 흔히 사용되는 방식이라고 할 정도로 블로그에 기술이 많이 되어 있네요. 아직 제가 lag 함수 개념이 없나봅니다. 저런 상황에서는 굳이 lag 함수가 필요 없음에도 저렇게 생각을 하였네요.. 

 

존경합니다.

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