programing

SQL Server에서 RANK()를 사용하는 방법

lovejava 2023. 7. 8. 10:24

SQL Server에서 RANK()를 사용하는 방법

SQL Server에서 사용하는 데 문제가 있습니다.

내 코드는 다음과 같습니다.

SELECT contendernum,
       totals, 
       RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank
FROM (
   SELECT ContenderNum,
          SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a

해당 쿼리의 결과는 다음과 같습니다.

contendernum    totals    xRank
          1       196        1
          2       181        1
          3       192        1
          4       181        1
          5       179        1

제가 원하는 결과는 다음과 같습니다.

contendernum    totals    xRank
          1       196        1
          2       181        3
          3       192        2
          4       181        3
          5       179        4

다음을 기준으로 결과의 순위를 매기고 싶습니다.totals다음과 같은 값이 있는 경우181그러면 두 숫자는 동일할 것입니다.xRank.

변경:

RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank

대상:

RANK() OVER (ORDER BY totals DESC) AS xRank

다음 예를 살펴 보십시오.

SQL Fiddle 데모

또한 RANK(Transact-SQL)와 DENSE_RANK(Transact-SQL)의 차이를 확인할 수도 있습니다.

RANK(트랜잭션-SQL)

둘 이상의 행이 순위에 대해 동점일 경우 각 동점 행은 동일한 순위를 받습니다.예를 들어, 상위 영업 사원 두 명의 영업 사원이 동일한 영업 사원인 경우YTD 값, 둘 다 1위입니다.다음으로 매출이 높은 영업 사원YTD는 3위를 차지하는데, 그 이유는 순위가 더 높은 두 행이 있기 때문입니다.따라서 RANK 함수가 항상 연속 정수를 반환하지는 않습니다.

DENSE_RANK(트랜잭션-SQL)

순위에 공백이 없는 결과 집합의 파티션 내 행 순위를 반환합니다.행의 순위는 해당 행 앞에 오는 고유 순위의 수에 1을 더한 값입니다.

"SQL Server에서 Rank()를 사용하는 방법"이라는 질문 제목에 답하려면 다음과 같이 하십시오.

이 데이터 집합을 예로 사용합니다.

create table #tmp
(
  column1 varchar(3),
  column2 varchar(5),
  column3 datetime,
  column4 int
)

insert into #tmp values ('AAA', 'SKA', '2013-02-01 00:00:00', 10)
insert into #tmp values ('AAA', 'SKA', '2013-01-31 00:00:00', 15)
insert into #tmp values ('AAA', 'SKB', '2013-01-31 00:00:00', 20)
insert into #tmp values ('AAA', 'SKB', '2013-01-15 00:00:00', 5)
insert into #tmp values ('AAA', 'SKC', '2013-02-01 00:00:00', 25)

기본적으로 그룹화를 지정하는 파티션이 있습니다.

이 예제에서 2열로 분할하면 2열 값 그룹에 대한 순위가 순위 함수에 의해 생성됩니다.열 2 = 'SKA'인 행과 열 2 = 'SKB'인 행의 순위가 다릅니다.

순위는 다음과 같이 결정됩니다.모든 레코드의 순위는 해당 파티션에서 레코드 앞에 오는 순위를 1 더하기 1입니다.분할된 필드 이외의 선택한 필드 중 하나가 앞에 오는 필드와 다를 때만 순위가 증가합니다.선택한 모든 필드가 동일한 경우 순위가 동점이 되고 둘 다 값(1)이 할당됩니다.

두 번째 열에서 각 그룹의 값을 하나만 선택하려는 경우 다음 쿼리를 사용할 수 있습니다.

with cte as 
(
  select *, 
  rank() over (partition by column2 
             order by column3) rnk
  from t

) select * from cte where rnk = 1 order by column3;

결과:

COLUMN1 | COLUMN2   | COLUMN3                           |COLUMN4 | RNK
------------------------------------------------------------------------------
AAA     | SKB   | January, 15 2013 00:00:00+0000    |5   | 1
AAA     | SKA   | January, 31 2013 00:00:00+0000    |15  | 1
AAA     | SKC   | February, 01 2013 00:00:00+0000   |25  | 1

SQL 데모

RANK보다는 DENSE_RANK를 사용해야 합니다.유일한 차이점은 간격을 두지 않는다는 것입니다.또한 contendor_num으로 분할해서는 안 됩니다. 그렇지 않으면 개별 그룹에서 각 경쟁자의 순위를 매기므로 각 경쟁자는 분리된 그룹에서 1위를 차지합니다!

SELECT contendernum,totals, DENSE_RANK() OVER (ORDER BY totals desc) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a
order by contendernum

StackOverflow 사용에 대한 힌트는 DDL과 샘플 데이터를 게시하여 사람들이 자신의 시간을 덜 사용하도록 도와주세요!

create table Cat1GroupImpersonation (
contendernum int,
criteria1 int,
criteria2 int,
criteria3 int,
criteria4 int);

insert Cat1GroupImpersonation select
1,196,0,0,0 union all select
2,181,0,0,0 union all select
3,192,0,0,0 union all select
4,181,0,0,0 union all select
5,179,0,0,0;

DENSE_RANK()는 공백이 없는 순위입니다. 즉, "밀도"입니다.

select Name,EmailId,salary,DENSE_RANK() over(order by salary asc) from [dbo].[Employees]

RANK()-순위 사이의 간격을 포함합니다.

select Name,EmailId,salary,RANK() over(order by salary asc) from [dbo].[Employees]

이미 경쟁업체 번호별로 그룹화되었으므로 다시 분할할 필요가 없습니다.Dense_rank()를 사용하고 총계 desc를 기준으로 정렬합니다.요컨대,

SELECT contendernum,totals, **DENSE_RANK()** 
OVER (ORDER BY totals **DESC**) 
AS xRank 
FROM
(
   SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
   FROM dbo.Cat1GroupImpersonation
   GROUP BY ContenderNum
) AS a
SELECT contendernum,totals, RANK() OVER (ORDER BY totals ASC) AS xRank FROM
(
SELECT ContenderNum ,SUM(Criteria1+Criteria2+Criteria3+Criteria4) AS totals
FROM dbo.Cat1GroupImpersonation
 GROUP BY ContenderNum
) AS a

RANK()양호하지만 동일하거나 유사한 값에 대해 동일한 순위를 할당합니다. 만약 순위가 는 이 합니다.

ROW_NUMBER() OVER (ORDER BY totals DESC) AS xRank

T를 선택합니다.타밀어, T.영어, T.수학, T.Total, Dense_Rank()Over(T)(T순)전체 설명)로 표준_순위 출처(Tamil, 영어, 수학(Tamil+English+Maths)로 T로 선택)

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/12739208/how-to-use-rank-in-sql-server