sql >> Base de Datos >  >> RDS >> Mysql

MySQL obtiene el rango de valores duplicados en función de sus fechas de creación

select
t.*,
@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,
@prevDate := create_date
from
your_table t 
, (select @rank := 0, @prevDate := null) var_init
order by create_date, id

Explicación:

Aquí

, (select @rank := 0, @prevDate := null) var_init

las variables se inicializan. Es lo mismo que escribir

set @rank = 0;
set @prevDate = null;
select ... /*without the crossjoin*/;

Entonces, el orden de las columnas en la cláusula de selección es importante. Primero verificamos con esta línea

@rank := if(@prevDate = create_date, @rank, @rank + 1) as rank,

si la fila actual tiene la misma fecha que la fila anterior. @prevDate contiene el valor de la fila anterior. En caso afirmativo, el @rank la variable permanece igual, si no se incrementa.

En la siguiente línea

@prevDate := create_date

configuramos el @prevDate variable al valor de la fila actual. Por eso el orden de las columnas en select cláusula es importante.

Finalmente, dado que estamos comprobando con la fila anterior, si las fechas difieren, el order by cláusula es importante.