sql >> Databasteknik >  >> RDS >> PostgreSQL

Deterministisk sorteringsordning för fönsterfunktioner

Om du inte har slno i din tabell, då har du ingen tillförlitlig information vilken rad som infogades först. Det finns ingen naturlig ordning i en tabell, den fysiska ordningen på rader kan ändras när som helst (med valfri uppdatering eller med VACUUM , etc.)

Du kunde använd en opålitlig trick:ordna efter den interna 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 avsaknad av annan information vilken rad kom först (vilket är ett designfel till att börja med, fixa det!), kan du försöka spara det du kan med den interna tupel-ID ctid

    Rader kommer att vara i fysisk ordning när de infogas från början, men det kan ändras när som helst med vilken skrivoperation som helst till tabellen eller VACUUM eller andra händelser.
    Detta är ett mått på sista utväg och det kommer bryta.

  • Din presenterade fråga var ogiltig på flera punkter:kolumnnamn saknas i 1:a CTE, saknas tabellnamn i 2:a CTE, ...

  • Du behöver ingen CTE för detta.

Enklare med DISTINCT ON (överväganden för ctid tillämpa samma):

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



  1. Oracle SQL Loader ORA-01722:ogiltigt nummer vid laddning av CSV-fil med Windows-radändelser

  2. Lista alla tabeller i postgresql informationsschema

  3. Är användningen av RETURNING INTO-satsen snabbare än en separat SELECT-sats?

  4. SCD typ 4