over()는 원래 테이블 분할 함수인 partition과 함께 사용....
PARTITION 함수
그룹 내 순위 및 그룹 별 집계를 구할 때 유용하게 사용할 수 있다.
SELECT 순위함수() OVER(PARTITION BY 컬럼명 ORDER BY 컬럼명)
FROM 테이블명
SELECT 집계함수(컬럼명) OVER (PARTITION BY 컬럼명)
FROM 테이블명
순위함수
- ROW_NUMBER
- RANK
- DENSE_RANK
[MSSQL] ROW_NUMBER, RANK, DENSE_RANK 순위함수
집계함수
- SUM(합계)
- AVG(평균)
- MAX, MIN(최대, 최소)
- COUNT(개수)
예제1. 학생들의 등수 매기기
원본 데이터
다음과 같은 데이터가 있을때, 이 학생들의 등수를 매기려고 한다.
순위함수인 ROW_NUMBER를 이용하면 쉽게 등수를 매길 수 있다.
SELECT *, ROW_NUMBER() OVER(ORDER BY Score DESC) 'Row'
FROM TABLE_A

예제2. 학생들의 반별 등수 매기기
하지만, 이 학생들은 모두 같은반(Class)이 아닌 'A', 'B' 반으로 구분되어 있다.
통째로가 아니라 각 반 내에서의 등수를 매기고 싶다!
이때 바로 PARTITION으로 반을 분할하고 등수를 매기면된다.
SELECT *, ROW_NUMBER() OVER(PARTITION BY Class ORDER BY Score DESC) 'P_Row'
FROM TABLE_A

예제2. 반별 총 점수
해당 학생이 해당하는 반의 총 점수를 계산해보자
SELECT *, SUM(Score) OVER(PARTITION BY Class) AS 'C_Sum'
FROM TABLE_A

출처: https://ggmouse.tistory.com/119 [초보개발자꽁쥐]
[mysql] SQL OVER () 절-언제 그리고 왜 유용합니까? - 리뷰나라
USE AdventureWorks2008R2; GO SELECT SalesOrderID, ProductID, OrderQty ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total' ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg' ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count' ,MIN(OrderQt
daplus.net
차이점은 GROUP BY를 사용하면 GROUP BY에 포함되지 않은 열에 대해 집계 된 값만 가질 수 있다는 것입니다.
이 OVER절은 사용자가 사용하는 여부에 관계없이 다른 범위 ( “창”)에 대한 집계를 가질 수 있다는 점에서 강력합니다.GROUP BY 여부
예 : 당 SalesOrderID개수 및 전체 개수 가져 오기
SELECT
SalesOrderID, ProductID, OrderQty
,COUNT(OrderQty) AS 'Count'
,COUNT(*) OVER () AS 'CountAll'
FROM Sales.SalesOrderDetail
WHERE
SalesOrderID IN(43659,43664)
GROUP BY
SalesOrderID, ProductID, OrderQty
OVER 절(Transact-SQL) - SQL Server
쿼리 결과 집합 내의 사용자 지정 행 집합을 정의하는 OVER 절의 Transact-SQL 참조입니다.
docs.microsoft.com
'coding > mssql' 카테고리의 다른 글
@@IDENTITY (0) | 2022.04.15 |
---|---|
프로시져(Procedure)란? (0) | 2022.03.23 |
mssql SQL 작동순서 (0) | 2022.03.10 |
mssql CTE 이해 (우선 재귀제외) (0) | 2022.03.10 |
mssql ROW_NUMBER() over (0) | 2022.03.03 |