안녕하십니까.
SQL 2008을 사용하고 있습니다.
품번, 날짜, SEQ, 구분값으로 구성된 테이블이 있습니다.
날짜별로 여러 품번이 Y / N중 하나의 구분값을 가지고 입력됩니다.
한 날짜에 같은 품번이 있으면 SEQ가 증가 합니다.
대충 쿼리로 돌려보면
WITH TEST AS
(
SELECT '2015-01-01' DT, 1 SEQ, 'AAA' PARTNO, 'N' GUBUN
UNION ALL
SELECT '2015-01-01' DT, 1 SEQ, 'BBB' PARTNO, 'N' GUBUN UNION
ALL
SELECT '2015-01-01' DT, 2 SEQ, 'BBB' PARTNO, 'Y' GUBUN UNION
ALL
SELECT '2015-01-01' DT, 1 SEQ, 'CCC' PARTNO, 'N' GUBUN UNION
ALL
SELECT '2015-01-02' DT, 1 SEQ, 'AAA' PARTNO, 'Y' GUBUN UNION
ALL
SELECT '2015-01-02' DT, 1 SEQ, 'DDD' PARTNO, 'N' GUBUN UNION
ALL
SELECT '2015-01-02' DT, 1 SEQ, 'BBB' PARTNO, 'Y' GUBUN UNION
ALL
SELECT '2015-01-02' DT, 1 SEQ, 'CCC' PARTNO, 'N' GUBUN UNION
ALL
SELECT '2015-01-03' DT, 1 SEQ, 'AAA' PARTNO, 'N' GUBUN UNION
ALL
SELECT '2015-01-03' DT, 1 SEQ, 'CCC' PARTNO, 'Y' GUBUN UNION
ALL
SELECT '2015-01-03' DT, 2 SEQ, 'AAA' PARTNO, 'N' GUBUN
)
SELECT PARTNO, DT, SEQ,GUBUN FROM TEST
ORDER BY PARTNO, DT,
SEQ
이 쿼리를 돌리면 첨부된 '원래데이터.jpg' 처럼 나옵니다.
이 값을 첨부된 '최종본jpg' 처럼 각 품번별 특정 구분값별로 연속으로 나온 횟수를 구하고 싶습니다.
즉 AAA 품번이
AAA Y
AAA N
AAA Y
AAA Y
순서로 데이터가 들어왔으면
Y가 3이 아니라 중간에 N이 들어왔고 다음에 Y 2개가 들어왔으므로 2가 되어야 합니다.
그래서 결과는
AAA Y 1
AAA N 1
AAA Y 2
이렇게 되어야합니다..
즉 중간에 구분값이 달라지면 다시 카운트가 되어야 합니다
ROW_NUMBER() OVER (PARTITION BY PARTNO, DT ORDER BY PARTNO, DT, SEQ) |
이렇게 접근했더니 원하는 값이 안나오네요.
단순 ROW_NUMBER 구문이 아니라 전체를 그룹으로 묶을 무언가가 필요한거 같습니다.
고수님들의 도움 부탁 드립니다.
좋은 하루 되십시요.
감사합니다.
Comment 3
-
건우아빠
2015.03.18 15:44
간단할줄 알았는데....의외로 복잡해지네요.. 누적함수가 있는 버전이면 좀 수월할듯...
WITH TEST AS
(
SELECT '2015-01-01' DT, 1 SEQ, 'AAA' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-01' DT, 1 SEQ, 'BBB' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-01' DT, 2 SEQ, 'BBB' PARTNO, 'Y' GUBUN UNION ALL
SELECT '2015-01-01' DT, 1 SEQ, 'CCC' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-02' DT, 1 SEQ, 'AAA' PARTNO, 'Y' GUBUN UNION ALL
SELECT '2015-01-02' DT, 1 SEQ, 'DDD' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-02' DT, 1 SEQ, 'BBB' PARTNO, 'Y' GUBUN UNION ALL
SELECT '2015-01-02' DT, 1 SEQ, 'CCC' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-03' DT, 1 SEQ, 'AAA' PARTNO, 'N' GUBUN UNION ALL
SELECT '2015-01-03' DT, 1 SEQ, 'CCC' PARTNO, 'Y' GUBUN UNION ALL
SELECT '2015-01-03' DT, 2 SEQ, 'AAA' PARTNO, 'N' GUBUN
) ,
res as
(
SELECT PARTNO, DT, SEQ ,GUBUN
, PARTNO+GUBUN newgb
, ROW_NUMBER() over ( order by PARTNO, DT, SEQ) newseq
FROM TEST) ,
result as
(
SELECT a.*
, CASE WHEN a.newgb = b.newgb THEN 0 ELSE 1 END no
FROM res a left join res b on a.newseq = b.newseq + 1
)
SELECT r.PARTNO
, r.GUBUN
, COUNT(*) [연속cnt]
FROM (
SELECT a.PARTNO
, a.GUBUN
, SUM(b.no) seq
FROM result a left join result b on a.newseq > b.newseq - 1
GROUP BY a.PARTNO , a.GUBUN , a.newseq ) r
GROUP BY r.PARTNO , r.GUBUN , seq
-
아더
2015.03.18 16:30
아...이렇게 풀어야 하는군요....
두 분 모두 정말 정말 감사 드립니다.
아직 갈길이 멀었다는걸 또 느끼네요.
찬찬히 뜯어보면서 연구하겠습니다.
좋은 하루 되십시요..
연승구하기랑 비슷해보여서 링크 달아봅니다.
http://www.sqler.com/608815