sql >> Databáze >  >> RDS >> PostgreSQL

PG::Chyba:SELECT DISTINCT, ORDER BY se musí objevit ve výběrovém seznamu

Vím, že je to poměrně stará otázka, ale právě jsem si v hlavě prošel malý příklad, který mi pomohl pochopit, proč má Postgres toto zdánlivě zvláštní omezení na sloupce SELECT DISTINCT / ORDER BY.

Představte si, že máte v tabulce RSVP následující data:

 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

Nyní chcete získat seznam odlišných id_událostí seřazených podle jejich příslušných časů zahájení. Ale kde má být 1 jít? Měl by být první, protože jedna n-tice začíná 1. ledna 1970, nebo by měl být poslední kvůli 21. srpnu 2013?

Protože databázový systém nemůže učinit toto rozhodnutí za vás a syntaxe dotazu nemůže záviset na skutečných datech, se kterými může pracovat (za předpokladu event_id je unikátní), jsme omezeni na objednávání pouze podle sloupců z SELECT doložka.

Pokud jde o skutečnou otázku - alternativou k Matthewově odpovědi je použití agregační funkce jako MIN nebo MAX pro třídění:

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

Explicitní seskupení a agregace v start_time umožňují databázi přijít s jednoznačným řazením výsledných n-tic. Všimněte si však, že čitelnost je v tomto případě rozhodně problém;)



  1. Odpovídající všem hodnotám v klauzuli IN

  2. Postgresql:Skriptování provádění psql s heslem

  3. Existuje nějaký důvod k obavám z pořadí sloupců v tabulce?

  4. Jak najít výchozí umístění souboru pro datové soubory a soubory protokolu na serveru SQL Server