Comment sélectionner un identifiant avec une date de groupe maximum par catégorie dans PostgreSQL?

Pour un exemple, je voudrais sélectionner id avec le groupe de date max par catégorie, le résultat est: 7, 2, 6

id category date 1 a 2013-01-01 2 b 2013-01-03 3 c 2013-01-02 4 a 2013-01-02 5 b 2013-01-02 6 c 2013-01-03 7 a 2013-01-03 8 b 2013-01-01 9 c 2013-01-01 

Puis-je savoir comment faire cela dans PostgreSQL?

Ceci est un cas d’utilisation parfait pour DISTINCT ON (extension spécifique de Postgres du standard DISTINCT ):

 SELECT DISTINCT ON (category) id -- , category, date -- add any other column (expression) from the same row FROM tbl ORDER BY category, "date" DESC; 

Attention à l’ordre de sorting décroissant. Si la colonne peut être NULL, vous pouvez append NULLS LAST :

  • Tri de PostgreSQL par datetime asc, null d’abord?

DISTINCT ON est le plus simple et le plus rapide. Explication détaillée dans cette réponse connexe:

  • Sélectionnez la première ligne de chaque groupe GROUP BY?

Pour les grandes tables, considérez cette approche alternative:

  • Optimiser la requête maximale par groupe

Optimisation des performances pour de nombreuses lignes par category :

  • Optimiser la requête GROUP BY pour récupérer le dernier enregistrement par utilisateur

Essaye celui-là:

 SELECT * FROM Table1 t1 JOIN ( SELECT category, MAX(date) AS MAXDATE FROM Table1 GROUP BY category ) t2 ON T1.category = t2.category AND t1.date = t2.MAXDATE 

Voir ce SQLFiddle

Une autre approche consiste à utiliser la fonction de fenêtre first_value : http://sqlfiddle.com/#!12/7a145/14

 SELECT DISTINCT first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) FROM Table1 ORDER BY 1; 

… bien que je soupçonne que la suggestion de lui056 sera généralement meilleure lorsque des index appropriés sont présents.

Une troisième solution est:

 SELECT id FROM ( SELECT id, row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum FROM Table1 ) x WHERE rownum = 1; 

SELECT ID FROM tbl GROUPE PAR chat AYANT MAX (date)