2011-01-12 4 views
1

다음 쿼리가 있습니다. Northwind 데이터베이스에서 하나의 테이블 (고객) 만 사용합니다. 나는 그것이 어떻게 작동하고 그 의도가 무엇인지 전혀 모른다. 여기 DBA가 많이 있기를 바랍니다. 그래서 설명을 구합니다. 특히 OVERPARTITION이 무엇을하는지 모릅니다. 당신은 DB 스키마를 필요한 경우SELECT 쿼리를 이해하는 데 도움이 필요합니다.

WITH NumberedWomen AS 
(
    SELECT CustomerId ,ROW_NUMBER() OVER 
      (
       PARTITION BY c.Country 
       ORDER BY LEN(c.CompanyName) ASC 
      ) 
       women 
       FROM Customers c 
) 

SELECT * FROM NumberedWomen WHERE women > 3 

, 그것은이다 here

+0

회사 이름의 길이는 여성과 어떤 관련이 있습니까? 누가 번호를 매기겠습니까? – sjngm

+0

@sjngm 모르겠다. 내 코드가 아님. 개발자는 지루 했어야합니다. –

답변

4

이 기능 :

ROW_NUMBER() OVER (PARTITION BY c.Country ORDER BY LEN(c.CompanyName) ASC) 

LEN(companyName)에 의해 레코드를 주문, 각 country 내에서 기록의 연속 행 번호를 지정합니다.

이러한 데이터가있는 경우 :

country companyName 
US  Apple 
US  Google 
UK  BAT 
UK  BP 
US  GM 

다음 이름의 길이를 주문, 2 UK에 회사에 13 US 기업 및 1에서 번호를 할당합니다 쿼리 :

country companyName ROW_NUMBER() 
US  GM   1 
US  Apple   2 
US  Google  3 
UK  BP   1 
UK  BAT   2 
+0

+1 좋은 예 –

2

ROW_NUMBER()은 순위 지정 기능입니다.

OVER에는 순위 번호를 만드는 방법이 나와 있습니다.

PARTITION BY는 [표현]가 [표현] 새로운 가치를 귀하의 경우

을 포함 할 때마다 모든 국가에 대한 일련의 숫자가 생성 일을 시작으로 순위를 다시 시작 ROW_NUMBER 기능을 알려줍니다. 한 국가 내에서, 회사는 그들의 이름의 길이로 주문됩니다 (더 짧은 이름 = 낮은 순위).

마지막 쿼리

SELECT * NumberedWomen FROM 여자> 3

은 회사 컨트리 조합이 회사 중 하나의 부분은 3 짧은 이름을 가진 경우를 제외하고 모든 고객을 선택 같은 나라에서.

+0

+1 ____________ –

관련 문제