-
중급 (3-3)통계, 누적합, ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, 실행계획 살짝DB/SQL 2023. 2. 19. 21:45
---
https://youtube.com/playlist?list=PLyQR2NzLKOCbOYNJHKpCax4ija38yCqBN
이거 보는 중
---
(21/44)
통계4. 분석 함수, 누적 합계
댓
Q.같은 결과를반환 한다고 했을때 프로시저로 짜는게 더 좋나요 아니면 분석 함수를 사용하는게 더 좋을까요?
A.분석 함수요~
---
누적값 구하기!
하나의 테이블을 범위 조건으로 JOIN해서 구한다든지,
분석 함수를 사용해서 구한다든지
뭐가 더 좋은지도 알아보자
실습 데이터 https://drive.google.com/file/d/1C9ntlGVWzlXOwIHkWW9HqKbHiuz7NEmr/view
이 테이블로 누적값을 구하는 SQL을 작성해보자. ▽곡 별로 보겠다는거야
(1)방법1, JOIN + 범위 조건
A.COUNT_DT >= B.COUNT_DT 은
B에다 SUM할건데
저 조건이면
원래 앞에 조건만 하면
1(0801) = 1(0801)
1(0801) = 1(0802)
1(0801) = 1(0803)
이렇게 레코드가 걸리다가,
A가 8.1이면 B는 8.1것만 SUM이 되겠지. 저기서 0802, 0803은 빠지고 그루핑(이따 GROUP BY할 것)
A가 8.2이면 B는 8.1, 8.2것 SUM이 된다. 그렇게 레코드를 걸러주고
그리고 GROUP BY를 해주는데
NO 컬럼 보면 1~7이 계속 반복돼. 그렇게 그루핑 해주고, 날짜별로도 그루핑 해주면
1 - 0801
- 0802
- 0803
이렇게 나오겠지. SUM은 합계가 나오고
ORDER BY도
정말 누적값이 맞는지 알기 위해 순수한 DOWNLOAD COUNT도 노출 시킬 것.
GROUP BY에 A.DOWNLOAD_CNT를 넣고서 해도 되지만 (▽다중 GROUP BY는 가지수가 늘어나는건데, 아 되겠네 NO랑 COUNT_DT로 GROUP BY해놓으면 A.DOWNLOAD_CNT는 레코드 하나씩이구나)
번거로우니까 MAX씀 (▽MAX는 왜 쓴거지? 그냥 A.DOWNLOAD_CNT써도 어차피 하난데 나오지 않나?댓글에 질문도 있네 답변은 없지만.. 여러개니까 하나로 해줘야 되나? 해보긴 귀찮네)
타이틀도 같이 나타내주고 싶으면
MAX(A.TITLE) ▽MAX 왜 써??
(2)방법2, 분석 함수
이게 끝이다.
▽여기서부터 아래는 뭔말인지.. https://learn.microsoft.com/ko-kr/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-ver16 여기 다 있네 다음에 볼게
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
ROWS도 있고 : 하나의 행을 나타낼 때
RANGE도 있는데 : 범위를 나타내는 것 이 경우엔 별 차이점은 없다
만약 ORDER BY했을 때 COUNT_DT가 동일한 값들이 여러개가 있으면 그 애들을 포함을 할것이냐 말것이냐(상세한 내용은 블로그 https://jungmina.com/745)
이건 이전값부터 누적이 된건데 거꾸로 누적을 시킬수도 있다
NO 1 2 3만 보면
거꾸로 누적값 컬럼의
맨 아래가 590 590
그 다음 +351
그 다음 +815
(1), (2) 뭐가 성능에 더 좋은지는
JOIN은 같은 테이블 두번 액세스 했고, 분석 함수는 한번 함. 성능엔 분석함수가 더 유리
눈으로 확인해보자
ALTER~ 이거 실행
그리고 쿼리 실행
그리고 실행 계획
테이블 두번 액세스
버퍼수가 6개
(ALTER안하네)
이번엔 SQL실행
그리고 실행 계획
한번만 액세스, 3으로 줄었다
'DB > SQL' 카테고리의 다른 글
중급 (4-2)서브쿼리2, VIEW, inline view, PLAN보기, view merging, 스칼라서브쿼리, ROWNUM, 실행계획 해석, 캐싱&튜닝 (0) 2023.02.20 중급 (4-1)서브쿼리1, IN, subquery&join, ALTER SESSION, 괄호&FROM&WHERE (0) 2023.02.19 중급 (3-2)통계, 윈도우함수, OVER(), rank, row_number, partition by, 괄호 묶고 WHERE (0) 2023.02.19 중급 (3-1)통계, group by실전, rollup, cube, union all (0) 2023.02.19 중급 (2)INSERT ALL, INSERT FIRST, EXISTS (0) 2023.02.13