sql >> Database teknologi >  >> RDS >> PostgreSQL

Deterministisk sorteringsrækkefølge for vinduesfunktioner

Hvis du ikke har slno i din tabel, så har du ikke nogen pålidelig information, hvilken række der blev indsat først. Der er ingen naturlig rækkefølge i en tabel, den fysiske rækkefølge af rækker kan ændres til enhver tid (med enhver opdatering eller med VACUUM osv.)

Du kunne brug en upålidelig trick:sorter efter den interne ctid .

select *
from  (
   select id, status
        , row_number() OVER (PARTITION BY id
                             ORDER BY date, ctid) AS row_num
   from   status  -- that's your table name??
   where  date >= '2015-06-01'  -- assuming column is actually a date
   and    date <  '2015-07-01'
  ) sub
where  row_num = 1;
  • I mangel af andre oplysninger, hvilken række kom først (hvilket er en designfejl til at begynde med, fix det!), kan du prøve at gemme, hvad du kan ved hjælp af den interne tupel-id ctid

    Rækker vil være i fysisk rækkefølge, når de indsættes i starten, men det kan ændres til enhver tid med enhver skriveoperation til tabellen eller VACUUM eller andre begivenheder.
    Dette er en sidste udvej, og det vil pause.

  • Din præsenterede forespørgsel var ugyldig på flere punkter:manglende kolonnenavn i 1. CTE, manglende tabelnavn i 2. CTE, ...

  • Du behøver ikke en CTE til dette.

Enklere med DISTINCT ON (overvejelser for ctid anvende det samme):

SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;



  1. Mysql vælg række, når kolonneværdien ændres

  2. Opdater værdier i Mysql-tidsstempel til en datetime-værdi.

  3. sammenføj to forskellige tabeller og fjern duplikerede poster

  4. Hvordan samles datatyper som heltal (heltal med heltal) &varchar (varchar med varchar) i mysql?