PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Детерминиран ред на сортиране за прозоречни функции

Ако нямате slno във вашата таблица, тогава нямате надеждна информация кой ред е вмъкнат първи. Няма естествен ред в таблица, физическият ред на редовете може да се промени по всяко време (с всяка актуализация или с VACUUM и т.н.)

Вие можете използвайте ненадежден трик:подредете по вътрешния 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;
  • При липса на друга информация кой ред е бил първи (което е грешка при проектирането като за начало, поправете го!), можете да опитате да запазите каквото можете, като използвате вътрешния идентификатор на кортеж ctid

    Редовете ще бъдат във физически ред, когато бъдат вмъкнати първоначално, но това може да се промени по всяко време с всяка операция за запис в таблицата или VACUUM или други събития.
    Това е крайна мярка и ще прекъсване

  • Представената от вас заявка беше невалидна по няколко причини:липсващо име на колона в 1-во CTE, липсващо име на таблица във 2-ро CTE, ...

  • За това нямате нужда от CTE.

По-лесно с DISTINCT ON (съображения за ctid прилагайте същото):

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. Промяна на езика на системата и съобщенията за грешки в PostgreSQL

  2. Как да прехвърля низ към цяло число и да имам 0 в случай на грешка при прехвърлянето с PostgreSQL?

  3. Защо използването на едно и също поле при филтриране води до различно време за изпълнение? (различно използване на индекс)

  4. Функцията low() за международни знаци в postgresql

  5. bundle exec rake assets:precompile - конфигурацията на базата данни не указва адаптер