PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Deterministyczny porządek sortowania funkcji okien

Jeśli nie masz slno w Twojej tabeli, to nie masz żadnych wiarygodnych informacji, który wiersz został wstawiony jako pierwszy. Nie ma naturalnej kolejności w tabeli, fizyczna kolejność wierszy może się zmienić w dowolnym momencie (z dowolną aktualizacją lub za pomocą VACUUM itp.)

możesz użyj niewiarygodnego sztuczka:kolejność według wewnętrznego 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;
  • W przypadku braku innych informacji, który wiersz pojawił się jako pierwszy (co jest błędem projektowym) na początek napraw to!), możesz spróbować zapisać to, co możesz, korzystając z wewnętrznego Identyfikator krotki ctid

    Po początkowym wstawieniu wiersze będą w fizycznej kolejności, ale może się to zmienić w dowolnym momencie przy dowolnej operacji zapisu do tabeli lub VACUUM lub inne wydarzenia.
    Jest to środek ostateczny i będzie przerwa.

  • Przedstawione zapytanie było nieprawidłowe z kilku powodów:brak nazwy kolumny w 1. CTE, brak nazwy tabeli w 2. CTE, ...

  • Nie potrzebujesz do tego CTE.

Łatwiej dzięki DISTINCT ON (rozważania dla ctid zastosuj to samo):

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie pg_dump do pobierania instrukcji wstawiania tylko z jednej tabeli w bazie danych

  2. Tworzenie użytkownika z zaszyfrowanym hasłem w PostgreSQL

  3. kod powrotu psql, jeśli znaleziono zero wierszy

  4. psycopg2 mapowanie Python :lista wersetów do Postgres :tablica typu złożonego dla instrukcji INSERT

  5. Wybierz pierwszą literę w zakresie ( PostgreSQL )