No Data Tno GRP
1 | A | 1 1
2 | A | 0 1
3 | A | 0 1
4 | B | 1 2
5 | B | 0 2
6 | B | 0 2
7 | C | 1 3
8 | C | 0 3
9 | A | 1 4
10 | A | 0 4
11 | A | 0 4
12 | B | 1 5
13 | B | 0 5
14 | B | 0 5
15 | C | 1 6
16 | C | 0 6
17 | C | 0 6
18 | A | 1 7
19 | A | 0 7
20 | B | 1 8
21 | B | 0 8
22 | C | 1 9
23 | C | 0 9
24 | D | 1 10
25 | D | 0 10
declare @i int
set @i = 0
select no, data, tno, @i as grp
from te
현재 테이블처럼 grp 라는 컬럼에
① Tno 값이 1일때 1 증가
② Tno 값이 0일때 ①을 가져옴
③ ①,② 반복
Data는 중복이 될수도 있고 3개가 아닌 2개일수도 있고 1개일수도 있습니다..
그룹으로 묶을려니 데이터 중복때문에 안되고 도와주세용 ! ㅜ
Comment 4
-
minblue1004
2014.04.08 15:24
-
맨즈밤
2014.04.08 17:49
적어주신 저 순서대로 반드시 그렇게 해야하는건가요? 일단 샘플 예제로 쿼리짜봤는데요. 데이터를
반복적으로 읽는부분이 있어서 성능적으로는 어떨지는 모르겠군요.
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)
;
WITH WITH_TEMP
AS
(
SELECT NO,DATA,GRP=ROW_NUMBER() OVER(ORDER BY NO,DATA)
FROM #TEMP
WHERE TNO=1
)
SELECT A.NO,A.DATA,A.TNO,GRP=B.GRP
FROM #TEMP A
LEFT JOIN
( SELECT T1.DATA,T1.GRP,START_NO=T1.NO,END_NO=CASE WHEN T2.NO IS NULL THEN (SELECT MAX(NO) FROM #TEMP) ELSE T2.NO-1 END
FROM WITH_TEMP T1
LEFT JOIN WITH_TEMP T2
ON T1.GRP=T2.GRP-1 ) B
ON A.DATA=B.DATA AND A.NO BETWEEN B.START_NO AND B.END_NODROP TABLE #TEMP
-
minblue1004
2014.04.10 09:51
맨즈밤님 감사합니다 ㅎㅎ
저는 이렇게 풀렸내요 ㅎㅎ
declare @t2 table
(
no int, grp int
)declare @i int
declare @result intset @i = 0
set @result = 0declare @max int
select @max = max(no) from tedeclare @val int
while(@i <= @max)
begin
select @val = tno from te where no = @i
if @val = 1
begin
set @result = @result + 1
insert into @t2 values (@i, @result)
end
else
insert into @t2 values (@i, @result)
set @i = @i + 1
end
select * from te a
join @t2 b
on a.no = b.no -
이스트럭(강동운)
2014.04.10 21:00
안녕하세요~!!
아까 잘못된 답변을 올려서 다시 올립니다 ^^
이거 잘하면 될 것 같은데라는 마음으로 연구하다가 풀었네요 ㅎㅎㅎ
CREATE 명령어는 맨즈밤님 소스 가져다 썼습니다.
감사합니다 ^^
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)
;
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
declare @i int
declare @grp varchar(10)
set @i = 0
set @grp = @i
select no, data, tno,
CASE WHEN tno = '1' THEN @i + 1
WHEN tno = '0' THEN @grp END as grp
from te
요롷게 하니 자꾸 @i 가 초기화대서 tno 랑 똑같이 나온다능