sql >> Databasteknik >  >> RDS >> Mysql

MySQL får rang av dubbletter av värden baserat på deras skapande datum

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

Förklaring:

Här

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

variablerna initialiseras. Det är samma sak som att skriva

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

Då är ordningen på kolumnerna i select-satsen viktig. Först kollar vi med den här raden

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

om den aktuella raden har samma datum som föregående rad. @prevDate innehåller värdet för föregående rad. Om ja, @rank variabeln förblir densamma, om inte ökas den.

I nästa rad

@prevDate := create_date

vi ställer in @prevDate variabel till värdet på den aktuella raden. Det är därför ordningen på kolumnerna i select klausul är viktig.

Slutligen, eftersom vi kontrollerar med föregående rad, om datumen skiljer sig, order by klausul är viktig.




  1. Ta bort från en tabell med join

  2. KGXGN polling fel (15)

  3. Flytta systemdatabaser i SQL Server-failover-klustret

  4. MySQL UNION-klausul