Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL ottiene il rango dei valori duplicati in base alle date di creazione

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

Spiegazione:

Qui

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

le variabili vengono inizializzate. È come scrivere

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

Quindi l'ordine delle colonne nella clausola select è importante. Per prima cosa controlliamo con questa riga

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

se la riga corrente ha la stessa data della riga precedente. @prevDate contiene il valore della riga precedente. Se sì, il @rank la variabile rimane la stessa, in caso contrario viene incrementata.

Nella riga successiva

@prevDate := create_date

impostiamo il @prevDate variabile al valore della riga corrente. Ecco perché l'ordine delle colonne nel select la clausola è importante.

Infine, poiché stiamo verificando con la riga precedente, se le date differiscono, il order by la clausola è importante.