Serach

2013년 10월 10일 목요일

MS-SQL 순위 함수

1. Rank()

Rank는 Over이하에 지정한 열의 순서대로 순번을 정합니다.(순서가 같은 경우에는 그 같은 수만큼 다음번 순위에 더해져서 조회됩니다.)

Select BusinessEntityID, Rank() Over(Order By OrganizationLevel Asc)
From HumanResources.Employee

OrganizationLevel의 값이 오름차순정렬된 순서대로 순번을 지정합니다.(이때 같은 순번만큼 다음 순위에 더하게 됩니다.)


보시는 바와 같이 순위가 2다음에는 3이 되어야 하지만 순위가 2위인 OrganizationLevel열값이 같은 것만큼 다음 순위에 더해진 후 조회되고 있습니다.

2. Dense_Rank()

Dense_Rank()는 순위가 같은건 묶어서 출력하되 순서대로 순번을 지정하여 조회하도록 합니다.

Select BusinessEntityID, Dense_Rank() Over(Order By OrganizationLevel Asc)
From HumanResources.Employee




OrganizationLevel값을 오름차순정렬된 순서대로 순위를 지정합니다.

기존 Rank()에서는 2다음 순위가 8이었으나 Dense_Rank()에서는 건너뛰는 순위가 없이 순서대로 지정됩니다.

3. Row_Number()

Row_Number()에서는 특정한 열값의 정렬순서대로 데이터를 정렬하긴 하지만  행단위로 순번을 지정하기 때문에 중복되는 순번이 존재하지 않으며 같은 순번만큼 더해서 출력하는 경우도 없습니다. 따라서 모든 행마다 순번을 순서대로 지정할 수 있습니다.

Select BusinessEntityID, Row_Number() Over(Order By OrganizationLevel Asc)
From HumanResources.Employee

OrganizationLevel의 값을 오름차순으로 정렬한 순서대로 조회합니다.


4. Ntile(x)

조회하는 데이터를 x에 지정한 수만큼 분할하여 순위를 부여합니다.

Select ProductID, Name, Ntile(10) Over(Order By SafetyStockLevel Asc)
From Production.Product

SafetyStockLevel열값을 오름차순으로 정렬한 후 출력되는 행전체를 10등분합니다. 그리고 10등분한 만큼 순위를 지정하여 출력하도록 합니다.




SafetyStockLevel이 오름차순으로 정렬된 Production.Product Table 전체 504행이 정확히 10등분 되고 각 등분마다 순위가 지정되었습니다.

Partition By는 지정된 열별로 Group을 나누어 그 Group안에서만 순위를 지정하도록 합니다. Partition By는 Rank, Dense_Rank, Row_Number, Ntile에 모두 적용할 수 있습니다.

Select ProductID, SafetyStockLevel, Rank() Over(Partition By SafetyStockLevel Order By StandardCost Asc)
From Production.Product

StandardCost에서 오름차순 순서대로 순위를 지정합니다. 이때 SafetyStockLevel이 같은것끼리만 묶어 각각의 Group안에서만 순위를 지정하도록 합니다.


보시는 바와 같이 Rank에 의해 순위가 지정되었으나 SafetyStockLevel이 4인것만 54까지 순위가 지정되고 SafetyStockLevel의 값이 다른것은 순위가 재지정되었습니다.

댓글 없음:

댓글 쓰기