sql >> Database >  >> RDS >> Mysql

MySQL krijgt een rangorde van dubbele waarden op basis van hun aanmaakdatums

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

Uitleg:

Hier

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

de variabelen worden geïnitialiseerd. Het is hetzelfde als schrijven

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

Dan is de volgorde van de kolommen in de select-clausule van belang. Eerst controleren we met deze regel

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

als de huidige rij dezelfde datum heeft als de vorige rij. De @prevDate bevat de waarde van de vorige rij. Zo ja, de @rank variabele blijft hetzelfde, zo niet wordt deze verhoogd.

In de volgende regel

@prevDate := create_date

we stellen de @prevDate . in variabele aan de waarde van de huidige rij. Daarom is de volgorde van de kolommen in de select clausule is belangrijk.

Ten slotte, aangezien we met de vorige rij controleren, als de datums verschillen, de order by clausule is belangrijk.




  1. Kan Mysql niet starten op Mac

  2. update waarden van twee tabellen met dezelfde pcode en id

  3. Trage MySQL-inserts

  4. 3 manieren om de eerste dag van de maand in SQL Server te krijgen