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
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
'programing' 카테고리의 다른 글
사이트 '글로벌이 정의되지 않았습니다' (0) | 2023.07.08 |
---|---|
Angular2 - TypeError: this.http.get(...).toPromise가 함수가 아닙니다. (0) | 2023.07.08 |
오류 코드: 1054:테이블이 있는 경우 '필드 목록'에서 'table_name.column_name' 열을 알 수 없음 (0) | 2023.07.08 |
오류: 'babel-register' 모듈을 찾을 수 없습니다. (0) | 2023.07.08 |
모듈 빌드 실패:오류: 다음에 대한 출력이 없는 형식 스크립트입니다. (0) | 2023.07.08 |