sql >> Base de Datos >  >> RDS >> PostgreSQL

PG::Error:SELECT DISTINCT, ORDER BY las expresiones deben aparecer en la lista de selección

Sé que esta es una pregunta bastante antigua, pero acabo de analizar un pequeño ejemplo en mi cabeza que me ayudó a comprender por qué Postgres tiene esta restricción aparentemente extraña en las columnas SELECT DISTINCT / ORDER BY.

Imagina que tienes los siguientes datos en tu tabla 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

Ahora desea obtener una lista de event_ids distintos, ordenados por sus respectivos start_times. Pero, ¿dónde debería 1 ¿Vamos? ¿Debería ser el primero, porque la tupla comienza el 1 de enero de 1970, o debería ser el último debido al 21 de agosto de 2013?

Como el sistema de la base de datos no puede tomar esa decisión por usted y la sintaxis de la consulta no puede depender de los datos reales en los que podría estar operando (suponiendo que event_id es único), estamos restringidos a ordenar solo por columnas del SELECT cláusula.

En cuanto a la pregunta real, una alternativa a la respuesta de Matthew es usar una función agregada como MIN o MAX para la clasificación:

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

La agrupación y agregación explícitas en start_time permitir que la base de datos genere un orden inequívoco de las tuplas resultantes. Tenga en cuenta, sin embargo, que la legibilidad es definitivamente un problema en este caso;)