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

PG::Error:SELECT DISTINCT, ORDER BY изразите трябва да се появят в списъка за избор

Знам, че това е доста стар въпрос, но току-що минах през малък пример в главата си, който ми помогна да разбера защо Postgres има това на пръв поглед странно ограничение за SELECT DISTINCT / ORDER BY колони.

Представете си, че имате следните данни във вашата Rsvp таблица:

 event_id |        start_time
----------+------------------------
    0     | Mar 17, 2013  12:00:00
    1     |  Jan 1, 1970  00:00:00
    1     | Aug 21, 2013  16:30:00
    2     |  Jun 9, 2012  08:45:00

Сега искате да вземете списък с различни идентификатори на event_id, подредени по съответните им start_times. Но къде трябва 1 отивам? Трябва ли да е на първо място, защото единственият кортеж започва на 1 януари 1970 г., или трябва да е последен заради 21 август 2013 г.?

Тъй като системата на базата данни не може да вземе това решение вместо вас и синтаксисът на заявката не може да зависи от действителните данни, с които може да работи (при условие, че event_id е уникален), ние сме ограничени до подреждане само по колони от SELECT клауза.

Що се отнася до действителния въпрос - алтернатива на отговора на Матю е използването на агрегатна функция като MIN или MAX за сортиране:

  SELECT event_id
    FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)

Изричното групиране и агрегиране в start_time позволява на базата данни да излезе с недвусмислено подреждане на кортежите с резултати. Имайте предвид обаче, че четливостта определено е проблем в този случай;)



  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 със sqlalchemy

  2. Не може да се свърже с postgres с помощта на jdbc в pyspark shell

  3. Защо трябва да научите PostgreSQL?

  4. Сравнение на типовете колони на базата данни в MySQL, PostgreSQL и SQLite? (Кръстосано картографиране)

  5. Spring Docker контейнерът няма достъп до Postgres Docker контейнера