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

Ordinamento deterministico per le funzioni della finestra

Se non hai slno nella tua tabella, quindi non hai alcuna informazione affidabile quale riga è stata inserita per prima. Non esiste un ordine naturale in una tabella, l'ordine fisico delle righe può cambiare in qualsiasi momento (con qualsiasi aggiornamento o con VACUUM , ecc.)

Potresti usa un inaffidabile trucco:ordina in base al ctid interno .

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;
  • In assenza di altre informazioni, quale riga è arrivata prima (che è un errore di progettazione per cominciare, correggilo!), potresti provare a salvare ciò che puoi utilizzando il ID tupla ctid

    Le righe saranno in ordine fisico quando inserite inizialmente, ma ciò può cambiare in qualsiasi momento con qualsiasi operazione di scrittura sulla tabella o VACUUM o altri eventi.
    Questa è una misura di ultima risorsa e lo farà pausa.

  • La query presentata non era valida per diversi motivi:nome della colonna mancante nel 1° CTE, nome della tabella mancante nel 2° CTE, ...

  • Non hai bisogno di un CTE per questo.

Più semplice con DISTINCT ON (considerazioni per ctid applicare lo stesso):

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