2009-11-10 9 views
8

Parece que debería tener una solución básica, pero parece que no la obtengo.Grupo SQL con orden por

Tome esta consulta:

  SELECT Category FROM Article 
      GROUP BY Category 

quiero hacer esto de manera efectiva:

  SELECT Category, DatePublished FROM Article 
      GROUP BY Category 
      ORDER BY DatePublished DESC 

que realmente no quieren para seleccionar DatePublished, pero parecía tener sentido para pedir por ella. Eso no funciona, sin embargo.

Básicamente quiero ordenar categorías por el artículo más reciente de DatePublished.

Respuesta

19
SELECT Category 
FROM Article 
GROUP BY 
     Category 
ORDER BY 
     MAX(DatePublished) DESC 

Desde que hace un GROUP BY, es necesario ejecutar alguna función agregada sobre columnas no de agrupación.

MAX seleccionará la fecha del último artículo publicado de cada categoría y ordenará las categorías en consecuencia.

6

En agregaciones (->GROUP BY), sólo se puede seleccionar campos/uso en combinación con funciones de agregación (por ejemplo SUM, MAX, MIN) y campos enumerados en el GROUP BY -clause.

muestra simple:

A | B 
-----+----- 
1 | 2 
1 | 3 

si iba a escribir SELECT A,B FROM table GROUP BY A, que sería Rendimiento:

A | B 
-----+----- 
1 |{2,3} 

pero eso no es posible (B tiene 2 valores en una fila!?!). Tienes que hacer algo con los valores de B que los agrupa también. Así que dos posibilidades:

: Añadir B en el GROUP BY -clause

SELECT A,B FROM table GROUP BY A,B 

produce

A | B 
-----+----- 
1 | 2 
1 | 3 

: Utilice una función de agregación en B

SELECT A,MAX(B) FROM TABLE GROUP BY A,B 

le da

A | B 
-----+----- 
1 | 3 

Los mismos argumentos se aplican a la cláusula ORDER BY.

mayoría de las veces cuando se quiere escribir una declaración como la primera que se presentó con, posibilidad 1 es la solución, ya que es posible saber que A y B van de la mano (muestra común: UserId y UserName) pero el ¡RDBMS no lo sabe!