sql >> Databáze >  >> RDS >> Mysql

MySQL získá pořadí duplicitních hodnot na základě jejich dat vytvoření

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

Vysvětlení:

Zde

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

proměnné jsou inicializovány. Je to stejné jako psaní

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

Pak je důležité pořadí sloupců v klauzuli select. Nejprve zkontrolujeme tento řádek

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

pokud má aktuální řádek stejné datum jako předchozí řádek. @prevDate obsahuje hodnotu předchozího řádku. Pokud ano, @rank proměnná zůstává stejná, pokud ne, je inkrementována.

V dalším řádku

@prevDate := create_date

nastavíme @prevDate proměnné na hodnotu aktuálního řádku. To je důvod, proč pořadí sloupců v select klauzule je důležitá.

A konečně, protože kontrolujeme s předchozím řádkem, pokud se data liší, order by klauzule je důležitá.




  1. Proč COUNT() zobrazuje pouze jeden řádek tabulky?

  2. Zabaluje SQL Server dotazy Select...Insert do implicitní transakce?

  3. Zřetězení hodnot sloupců do seznamu odděleného čárkami

  4. pg_dump ignoruje sekvenci tabulky?