2012-11-07 3 views
3

Je reçois une erreur d'exécuter cette requêtegroupe par date fonction d'agrégation dans postgresql

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons" 
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07  12:25:04.082224') 
GROUP BY date(updated_at) 
ORDER BY persons.updated_at DESC 

Je reçois l'erreur erreur: la colonne « persons.updated_at » doit apparaître dans la clause GROUP BY ou être utilisé dans un fonction d'agrégation LIGNE 5: ORDER BY persons.updated_at DESC

Cela fonctionne si je retire la date (fonction du groupe par appel, mais je suis en utilisant la fonction de la date parce que je veux groupe par date, non datetime

des idées

Répondre

7

Pour le moment, il n'est pas clair ce que vous voulez que Postgres retourne. Vous dites qu'il devrait commander par persons.updated_at mais vous ne récupérez pas ce champ de la base de données.

je pense, ce que vous voulez faire est:

SELECT date(updated_at), count(updated_at) as total_count 
FROM "persons" 
WHERE ("persons"."updated_at" BETWEEN '2012-10-17 00:00:00.000000' AND '2012-11-07  12:25:04.082224') 
GROUP BY date(updated_at) 
ORDER BY count(updated_at) DESC -- this line changed! 

Maintenant, vous dites explicitement la DB pour trier par la valeur résultant du décompte global. Vous pouvez également utiliser: ORDER BY 2 DESC, indiquant effectivement à la base de données de trier par la deuxième colonne dans le jeu de résultats. Cependant, je préfère nettement énoncer explicitement la colonne pour plus de clarté.

Notez que que je suis actuellement impossible de tester cette requête, mais je pense que cela devrait fonctionner.

3

le problème est que, parce que vous regroupez par date(updated_at), la valeur updated_at peut ne pas être uniques, différentes valeurs de updated_at peut retourner la même valeur pour date(updated_at). Vous devez dire la base de données qui des valeurs possibles qu'il doit utiliser ou alternativement utiliser la valeur retournée par le groupe par, sans doute l'un des

SELECT date(updated_at) FROM persons GROUP BY date(updated_at) 
ORDER BY date(updated_at) 

ou

SELECT date(updated_at) FROM persons GROUP BY date(updated_at) 
ORDER BY min(updated_at) 
+0

'min()' dans le «ORDER BY» a sauvé ma journée! – sequielo