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.