안녕하세요. 이스트럭(강동운) 입니다.
이번에도 sqler 질문에 올라온 글입니다 ^^
바로 그룹번호가 없을 때 RANK 함수를 이용해서 그룹번호를 효과적으로 만들 수 있는 방법입니다~!
CREATE TABLE #TEMP ( NO INT , DATA CHAR(1) ,TNO INT )
INSERT #TEMP
VALUES (1,'A',1),
(2,'A',0),
(3,'A',0),
(4,'B',1),
(5,'B',0),
(6,'B',0),
(7,'C',1),
(8,'C',0),
(9,'A',1),
(10,'A',0),
(11,'A',0),
(12,'B',1),
(13,'B',0),
(14,'B',0),
(15,'C',1),
(16,'C',0),
(17,'C',0),
(18,'A',1),
(19,'A',0),
(20,'B',1),
(21,'B',0),
(22,'C',1),
(23,'C',0),
(24,'D',1),
(25,'D',0)
GO
SELECT * FROM #TEMP
SELECT
NO - RANK() OVER(PARTITION BY DATA ORDER BY NO) AS FIRST_GROUP_NO
, NO
, DATA
, TNO
FROM #TEMP
사실 이 쿼리 가지고 효과적으로 그룹번호를 만들 수 있습니다.
SEQUENCE가 없다면.. ROW_NUMBER로 먼저 가공후에 만들 수도 있겠네요~!
SELECT
FIRST_GROUP_NO
, MAX(NO) OVER(PARTITION BY FIRST_GROUP_NO) AS SECOND_GROUP_NO
, NO
, DATA
, TNO
FROM
(
SELECT
NO - RANK() OVER(PARTITION BY DATA ORDER BY NO) AS FIRST_GROUP_NO
, NO
, DATA
, TNO
FROM #TEMP
) AA
SELECT
NO
, DATA
, TNO
, DENSE_RANK() OVER(ORDER BY SECOND_GROUP_NO)
FROM
(
SELECT
FIRST_GROUP_NO
, MAX(NO) OVER(PARTITION BY FIRST_GROUP_NO) AS SECOND_GROUP_NO
, NO
, DATA
, TNO
FROM
(
SELECT
NO - RANK() OVER(PARTITION BY DATA ORDER BY NO) AS FIRST_GROUP_NO
, NO
, DATA
, TNO
FROM #TEMP
) AA
) BB
ORDER BY NO

감사합니다 ^^
혹시 더 좋은 쿼리 있으면 공유해주세요 ^^