ruby on rails - inner - PG:: Error: SELECT DISTINCT, las expresiones ORDER BY deben aparecer en la lista de selección
rails select distinct (2)
ActionView :: Template :: Error (PG :: Error: ERROR: para SELECT DISTINCT, las expresiones ORDER BY deben aparecer en la lista de selección
Estoy creando un sitio web de eventos y estoy tratando de ordenar los rsvps representados por la hora de inicio del evento. Hay muchos RSVPS, así que los estoy agrupando con distintos, pero he tenido muchas dificultades en los últimos días para ordenar los resultados sin que aparezca este error en PG. He visto algunas de las preguntas anteriores sobre el tema y todavía estoy bastante perdido. ¿Cómo puedo hacer que esto funcione? Muchas gracias!
@rsvps = Rsvp.where(:voter_id => current_user.following.collect {|f| f["id"]}, :status => ''going'').where("start_time > ? AND start_time < ?", Time.now, Time.now + 1.month).order("count_all desc").count(:group => :event_id).collect { |f| f[0] }
<%= render :partial => ''rsvps/rsvp'', :collection => Rsvp.where(:event_id => @rsvps).select("DISTINCT(event_id)").order(''start_time asc'') %>
La cláusula ORDER BY solo se puede aplicar después de que se haya aplicado DISTINCT. Dado que solo se tienen en cuenta los campos de la instrucción SELECT para las operaciones DISTINCT, esos son los únicos campos que se pueden usar en ORDER BY.
Lógicamente, si solo desea una lista distinta de valores event_id, el orden en que ocurren debe ser irrelevante. Si el orden es importante, entonces debe agregar start_time a la lista SELECT para que haya contexto para la orden.
Además, estas dos cláusulas SELECT NO son equivalentes, así que ten cuidado:
SELECT DISTINCT(event_id, start_time) FROM ...
SELECT DISTINCT event_id, start_time FROM ...
El segundo es la forma que quieres. El primero devolverá una serie de registros con los datos representados como una construcción ROW (una sola columna con una tupla dentro). El segundo devolverá columnas normales de salida de datos. Solo funciona como se esperaba en el caso de una sola columna donde la construcción ROW se reduce porque es solo una columna.
Sé que esta es una pregunta bastante antigua, pero acabo de pasar por un pequeño ejemplo en mi cabeza que me ayudó a entender por qué Postgres tiene esta restricción aparentemente extraña en columnas SELECT DISTINCT / ORDER BY.
Imagine que tiene los siguientes datos en su 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 distintos event_ids, ordenados por sus respectivos start_times. Pero, ¿dónde debería ir 1
? ¿Debería ser lo primero, porque la tupla comienza el 1 de enero de 1970 o debería durar más debido al 21 de agosto de 2013?
Como el sistema de 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
sea único), estamos restringidos a ordenar solo por columnas de la cláusula SELECT
.
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ícita en start_time
permite a la base de datos obtener un ordenamiento inequívoco de las tuplas de resultados. Tenga en cuenta, sin embargo, que la legibilidad es definitivamente un problema en este caso;)