Como usar o RANK () no servidor SQL

tenho um problema em usar RANK() no servidor SQL.

Aqui está o meu código.
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

os resultados dessa consulta São:

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

Qual é o meu resultado desejado:

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

quero classificar o resultado com base em totals. Se houver o mesmo valor como 181, então dois números terão o mesmo xRank.

Author: dakab, 2012-10-05

8 answers

Alteração:

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

To:

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

Veja este exemplo:

Demonstração de violino SQL

Pode também querer ver a diferença entre RANK (Transact-SQL) e DENSE_RANK (Transact-SQL):

RANK (Transact-SQL)

Se duas ou mais linhas empatarem para um posto, cada linha empatada recebe o mesmo classificar. Por exemplo, se os dois vendedores de topo têm o mesmo SalesYTD valor, ambos são classificados como um. A vendedora com a mais alta O SalesYTD está classificado como número três, porque há duas linhas que são Classificado mais alto. Portanto, a função RANK nem sempre retorna inteiros consecutivos.

DENSE_RANK (Transact-SQL)

Devolve o rank de linhas dentro da partição de um conjunto de resultados, sem qualquer falha no ranking. O rank de uma linha é um mais o número de fileiras distintas que vêm antes da linha em pergunta.

 64
Author: Adriaan Stander, 2018-07-06 13:26:19

Para responder ao título da sua pergunta, "Como usar o Rank () no servidor SQL", é assim que funciona:

Vou usar este conjunto de dados como exemplo:

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)

Você tem uma partição que basicamente especifica o agrupamento.

Neste exemplo, se você partição por column2, a função rank irá criar fileiras para grupos de valores column2. Haverá diferentes graus para linhas onde column2 = 'SKA' do que linhas onde column2 = 'SKB' e assim por diante.

As fileiras são decididas como presente: A classificação para cada registro é um mais o número de fileiras que vêm antes dele em sua partição. A classificação só irá aumentar quando um dos campos que você selecionou (além do(S) Campo (s) particionado (s)) for diferente dos que vêm antes dele. Se todos os campos selecionados forem os mesmos, as fileiras empatarão e ambos serão atribuídos o valor, um.

Sabendo isto, se só quiséssemos seleccionar um valor de cada grupo na coluna dois, podíamos usar isto. pesquisa:
with cte as 
(
  select *, 
  rank() over (partition by column2 
             order by column3) rnk
  from t

) select * from cte where rnk = 1 order by column3;
Resultado:
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

DEMONSTRAÇÃO SQL

 15
Author: Jared Beach, 2014-02-13 15:46:53

Tens de usar o DENSE_RANK em vez do RANK. A única diferença é que não deixa lacunas. Você também não deve dividir por contenter_num, caso contrário você está classificando cada candidato em um grupo separado, então cada um é o primeiro classificado em seus grupos segregados!

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

Uma dica para usar o StackOverflow, por favor publique DDL e recolha de dados para que as pessoas possam ajudá-lo a usar menos do seu próprio tempo!

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;
 9
Author: RichardTheKiwi, 2012-10-05 03:53:58

DENSE_RANK () é um rank sem lacunas, ou seja, é "denso".

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

RANK () - ele contém diferença entre o rank.

select Name,EmailId,salary,RANK() over(order by salary asc) from [dbo].[Employees]
 2
Author: Debendra Dash, 2016-07-28 11:48:25

Você já agrupou por Contenternum, não há necessidade de dividir novamente por ele. Utilizar o Dense_rank () e a ordem por totais desc. Em resumo,

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
 0
Author: ajit, 2013-08-20 12:18:16
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
 0
Author: Adi, 2014-08-28 17:16:32

RANK() é bom, mas atribui a mesma classificação para valores iguais ou similares. E se você precisar de um rank único, então ROW_NUMBER () resolve este problema

ROW_NUMBER() OVER (ORDER BY totals DESC) AS xRank
 0
Author: Bex, 2018-08-10 17:14:33

Select T. Tamil, T. English, T. Maths, T. Total, Dense_Rank () Over (Order by T. Total Desc) as Std_Rank De (seleccionar Tâmil, Inglês, Matemática, (Tâmil+Inglês+Matemática) como total do estudante) como T indique aqui a descrição da imagem

 -1
Author: Rajenthiran T, 2018-04-23 14:08:06