sql-server - over - row_number sql server
Cómo usar RANK() en SQL Server (7)
Cambio:
RANK() OVER (PARTITION BY ContenderNum ORDER BY totals ASC) AS xRank
a:
RANK() OVER (ORDER BY totals DESC) AS xRank
Echa un vistazo a este ejemplo:
DEMO SQL Fiddle
También es posible que desee ver la diferencia entre RANK (Transact-SQL) y DENSE_RANK (Transact-SQL) :
RANK (Transact-SQL)
Si dos o más filas empatan para un rango, cada fila atada recibe el mismo rango. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, ambos se clasifican en uno. El vendedor con el próximo SalesYTD más alto se clasifica número tres, porque hay dos filas que están en una posición más alta. Por lo tanto, la función RANK no siempre devuelve enteros consecutivos.
DENSE_RANK (Transact-SQL)
Devuelve el rango de filas dentro de la partición de un conjunto de resultados, sin ningún espacio en la clasificación. El rango de una fila es uno más el número de rangos distintos que vienen antes de la fila en cuestión.
Tengo un problema al usar RANK()
en SQL Server.
Aquí está mi 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
Los resultados para esa consulta son:
contendernum totals xRank
1 196 1
2 181 1
3 192 1
4 181 1
5 179 1
Cuál es mi resultado deseado:
contendernum totals xRank
1 196 1
2 181 3
3 192 2
4 181 3
5 179 4
Quiero clasificar el resultado según los totals
. Si hay el mismo valor como 181
, entonces dos números tendrán el mismo xRank
.
DENSE_RANK () es un rango sin espacios vacíos, es decir, es "denso".
select Name,EmailId,salary,DENSE_RANK() over(order by salary asc) from [dbo].[Employees]
RANK () - Contiene espacio entre el rango.
select Name,EmailId,salary,RANK() over(order by salary asc) from [dbo].[Employees]
Debe usar DENSE_RANK en lugar de RANK. La única diferencia es que no deja huecos. Tampoco debe particionar por contendiente_num, de lo contrario está clasificando a cada contendiente en un grupo separado, por lo que cada uno ocupa el primer lugar en sus 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
Una pista para usar , publique DDL y muestree datos para que la gente pueda ayudarlo a usar menos de su propio tiempo.
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;
Para responder el título de su pregunta, "Cómo usar Rank () en SQL Server," así es como funciona:
Usaré este conjunto de datos como un ejemplo:
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)
Usted tiene una partición que básicamente especifica la agrupación.
En este ejemplo, si particiona por columna2, la función de rango creará rangos para grupos de valores de columna2. Habrá diferentes rangos para las filas donde column2 = ''SKA'' que las filas donde column2 = ''SKB'' y así sucesivamente.
Los rangos se deciden así: el rango para cada registro es uno más el número de rangos que le preceden en su partición. El rango solo aumentará cuando uno de los campos seleccionados (que no sean los campos particionados) sea diferente de los que vienen antes. Si todos los campos seleccionados son iguales, los rangos se vincularán y a ambos se les asignará el valor, uno.
Sabiendo esto, si solo quisiéramos seleccionar un valor de cada grupo en la columna dos, podríamos usar esta consulta:
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
Seleccione T.Tamil, T.English, T.Maths, T.Total, Dense_Rank () Over (Order by T.Total Desc) como Std_Rank From (seleccione Tamil, English, Maths, (Tamil + English + Maths) como Total From Estudiante) como T ingrese la descripción de la imagen aquí
Ya ha agrupado por ContenderNum, no es necesario volver a particionar. Use Dense_rank () y ordene por totales desc. En breve,
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