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

MySQL får rang af duplikerede værdier baseret på deres oprettelsesdatoer

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

Forklaring:

Her

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

variablerne initialiseres. Det er det samme som at skrive

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

Så er rækkefølgen af ​​kolonnerne i select-klausulen vigtig. Først tjekker vi med denne linje

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

hvis den aktuelle række har samme dato som den foregående række. @prevDate indeholder værdien af ​​den forrige række. Hvis ja, @rank variabel forbliver den samme, hvis ikke, øges den.

I næste linje

@prevDate := create_date
 

vi indstiller @prevDate variabel til værdien af ​​den aktuelle række. Det er derfor rækkefølgen af ​​kolonnerne i select klausul er vigtig.

Til sidst, da vi tjekker med den forrige række, hvis datoerne er forskellige, order by klausul er vigtig.




  1. Summen af ​​multiplikation af kolonner for rækker med lignende id'er i MySQL

  2. Er en deadlock mulig, når du opdaterer og sletter forskellige rækker i en tabel?

  3. Forespørgsel i Oracle for løbende sum

  4. Sådan implementeres databaseuafhængighed med Entity Framework