sql >> Database >  >> RDS >> PostgreSQL

Deterministische sorteervolgorde voor vensterfuncties

Als je geen slno . hebt in uw tabel, dan heeft u geen betrouwbare informatie welke rij als eerste is ingevoegd. Er is geen natuurlijke volgorde in een tabel, de fysieke volgorde van rijen kan op elk moment veranderen (met elke update, of met VACUUM , enz.)

Je zou gebruik een onbetrouwbare truc:bestel op de 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;
  • Bij gebrek aan andere informatie welke rij eerst kwam (wat een ontwerpfout is) om te beginnen, repareer het!), zou je kunnen proberen op te slaan wat je kunt met behulp van de interne tuple-ID ctid

    Rijen staan ​​in fysieke volgorde wanneer ze aanvankelijk worden ingevoegd, maar dat kan op elk moment veranderen met elke schrijfbewerking naar de tabel of VACUUM of andere gebeurtenissen.
    Dit is een laatste redmiddel en het zal pauze.

  • Uw gepresenteerde zoekopdracht was op verschillende punten ongeldig:kolomnaam ontbreekt in 1e CTE, ontbrekende tabelnaam in 2e CTE, ...

  • U hebt hiervoor geen CTE nodig.

Eenvoudiger met DISTINCT ON (overwegingen voor ctid hetzelfde toepassen):

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



  1. PHP MySQL Delete-functie in while-lus

  2. mysql tijdsverschil naar uren

  3. Kan parameter niet doorgeven via referentie in MySQLi

  4. Manier om de Windows-gebruikersnaam te achterhalen / op te halen in Oracle APEX