Pour un exemple, je voudrais sélectionner l'id avec le groupe de date maximum 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?
sql
postgresql
greatest-n-per-group
user2412043
la source
la source
Réponses:
C'est un cas d'utilisation parfait pour
DISTINCT ON
(extension spécifique de Postgres de la normeDISTINCT
):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 tri décroissant. Si la colonne peut être NULL, vous pouvez ajouter
NULLS LAST
:DISTINCT ON
est le plus simple et le plus rapide. Explication détaillée dans cette réponse connexe:Pour les grandes tables, envisagez cette approche alternative:
Optimisation des performances pour de nombreuses lignes par
category
:la source
Essaye celui-là:
SELECT t1.* 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
la source
Une autre approche consiste à utiliser la
first_value
fonction window: http://sqlfiddle.com/#!12/7a145/14SELECT 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 hims056 fonctionnera généralement mieux là où 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;
la source
SELECT id FROM tbl GROUP BY cat HAVING MAX (date)
la source