Sql 서버 창 열기 함수 Over()의 사용 실례 상세 설명

over()를 이용 하여 통계 정 보 를 계산 한 후 결과 집 을 직접 선별 합 니 다.

declare @t table(
ProductID int,
ProductName varchar(20),
ProductType varchar(20),
Price int)
insert @t
select 1,'name1','P1',3 union all
select 2,'name2','P1',5 union all
select 3,'name3','P2',4 union all
select 4,'name4','P2',4
조회 요구:각 제품 중 가격 이 가장 높 은 정 보 를 찾 아 냅 니 다.
-방법 1:각 그룹 에서 가격 이 가장 큰 값 을 찾 습 니 다.그리고 각 조 의 가격 이 이 값 인 것 을 찾 아 보 세 요.
--단점:join 을 한 번 진행 해 야 한다    

select t1.* from @t t1
 join (select ProductType, max(Price) Price from @t group by ProductType) t2 
 on t1.ProductType = t2.ProductType
 where t1.Price = t2.Price
 order by ProductType
--방법 2:over()를 이용 해 통계 정 보 를 계산 한 뒤 결과 집 을 직접 선별한다.
--over()는 함수(집합 함수 포함)를 줄 과 함께 출력 할 수 있 습 니 다. 

 ;with cte as(select *, max(Price) over(partition by (ProductType)) MaxPrice from @t)
select ProductID,ProductName,ProductType,Price from cte where Price = MaxPrice
 order by ProductType
-over()의 문법 은:over(patition by)입 니 다.주의해 야 할 것 은 over()앞 에 함수 가 있 습 니 다.취 합 함수 라면 orderby 는 함께 사용 할 수 없습니다.
--over()의 또 다른 상용 상황 은 rownumber()는 페이지 를 나 누 는 데 함께 사 용 됩 니 다.
이제 창문 을 여 는 함 수 를 소개 하 겠 습 니 다.
창 함수 OVER()는 창 함수 에서 출력 한 결 과 를 각 줄 의 값 으로 계산 하 는 줄 을 지정 합 니 다.
창 을 여 는 함 수 는 GROUP BY 를 사용 하지 않 아 도 데 이 터 를 그룹 으로 나 눌 수 있 고 기본 줄 의 열 과 집합 열 을 동시에 되 돌 릴 수 있 습 니 다. 
1.랭 킹 창 열기 함수
ROW_NUMBER、DENSE_RANK,RANK,NTILE 은 순위 함수 에 속한다.
순위 창 열기 함 수 는 ORDER BY 문 구 를 단독으로 사용 할 수도 있 고,PARTITION BY 와 동시에 사용 할 수도 있 습 니 다.
PARTITION BY 는 결과 집합 을 그룹 으로 나 누 는 데 사용 되 며,창 을 여 는 함 수 는 각 그룹 에 적 용 됩 니 다.
ODER BY 는 열 림 함수 의 순 서 를 지정 합 니 다.랭 킹 창 열기 함수 에서 ORDER BY 문 구 를 사용 해 야 합 니 다.
예 를 들 어 모든 직원 의 주문 서 를 조회 하고 시간 에 따라 순 서 를 매 긴 다.

;WITH OrderInfo AS
(
 SELECT ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY OrderDate) AS Number,
 OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK) 
)
SELECT Number,OrderID,CustomerID, EmployeeID ,OrderDate
From OrderInfo WHERE Number BETWEEN 0 AND 10
창 함 수 는 PARTITION BY 구문 에 따라 직원 ID 에 따라 데이터 줄 을 나 눈 다음 ORDER BY 구문 에 따라 정렬 하고 순위 함수 ROWNUMBER()는 각 그룹의 데이터 로 나 뉘 어 1 부터 하나의 번 호 를 생 성 합 니 다.
ROW_NUMBER()는 각 그룹의 줄 에 순서대로 유일한 번 호 를 생 성 합 니 다.
RANK()도 각 그룹의 줄 에 하나의 번 호 를 생 성하 고 ROWNUMBER()는 ORDER BY 의 정렬 에 따라 같은 값 이 있 으 면 같은 번 호 를 생 성하 고 다음 번 호 는 연결 되 지 않 습 니 다.예 를 들 어 같은 줄 두 개가 번호 3 을 만 들 면 그 다음 에 번호 5 가 생 긴 다.
DENSE_RANK()는 RANK()와 유사 하 며,다른 것 은 같은 번호 가 있다 면 다음 번 호 는 끊 기지 않 는 다 는 것 이다.같은 줄 두 개가 3 번 을 만 들 면 그 다음 에 생 성 되 는 번 호 는 4 라 는 것 이다.
NTILE (integer_expression)지정 한 숫자 에 따라 데 이 터 를 그룹 으로 나 누고 각 그룹 에 하나의 번 호 를 생 성 합 니 다.
2.취 합 창 함수
많은 집합 함 수 는 SUM,AVG,MAX,MIN 과 같은 창 함수 의 연산 으로 사용 할 수 있다.
취 합 창 함 수 는 PARTITION BY 자구 만 사용 할 수 있 거나 문구 가 없 으 며,ORDER BY 는 취 합 창 함수 와 함께 사용 할 수 없습니다.
예 를 들 어 직원 의 주문서 총수 와 주문서 정 보 를 조회 하 는 것 이다.

 WITH OrderInfo AS
(
SELECT COUNT(OrderID) OVER(PARTITION BY EmployeeID) AS TotalCount,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)
)
SELECT OrderID,CustomerID, EmployeeID ,OrderDate,TotalCount From OrderInfo ORDER BY EmployeeID
창 함수 가 PARTITION BY 문 구 를 사용 하지 않 는 다 면 데 이 터 를 그룹 으로 나 누 지 않 고 취 합 함수 로 모든 줄 의 값 을 계산 하 는 것 입 니 다.

 WITH OrderInfo AS
 (
 SELECT COUNT(OrderID) OVER() AS Count,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)
 )
총결산
위 에서 말 한 것 은 소 편 이 소개 한 Sql Server 창 열기 함수 Over()의 사용 사례 에 대한 상세 한 설명 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기