2011-07-05 2 views
2

i ont une table comme tellesql pour trouver le plus récent record dans un groupe

table_id | series_id | revision_id | year 
------------------------------------------ 
1  | 1   | 1   | 2010 
2  | 2   | 1   | 2009 
3  | 2   | 2   | 2008 
4  | 2   | 2   | 2009 
5  | 2   | 3   | 2010 
6  | 2   | 3   | 2008 
7  | 3   | 2   | 2007 
8  | 3   | 3   | 2010 
9  | 3   | 3   | 2010 

Je dois trouver le table_id pour le maximum (année) lorsqu'ils sont groupés par REVISION_ID lorsque les séries X = dans postgresql.

par exemple: lorsque x = 2 i attendre ce résultat

table_id | series_id | revision_id | year 
------------------------------------------ 
2  | 2   | 1   | 2009 
4  | 2   | 2   | 2009 
5  | 2   | 3   | 2010 

cela ne fonctionne pas

SELECT * from table 
WHERE series_id = 2 
AND table_id IN (
    SELECT table_id 
    FROM table 
    WHERE series_id = 2 
    GROUP by revision 
    ORDER BY year DESC 
) 

Je ne peux pas trouver un moyen de le faire dans postgresql depuis que je dois retourner un champ je ne suis pas le regroupement par

voici quelques problèmes similaires dans d'autres arômes SQL.

MySQL SQL Query, Selecting 5 most recent in each group

SQL SERVER SQL Server - How to select the most recent record per user?

+0

Et les solutions à ces problèmes ne fonctionnent pas ...? – OrangeDog

+0

mysql vous permet de sélectionner un champ qui n'est pas dans le groupe par, ce qui n'est pas autorisé dans postgres. Le TOP1 du serveur SQL n'est pas non plus supporté. –

+0

À moins que vous ne choisissiez en quelque sorte que l'enregistrement supérieur, je ne recommande pas de commander par quelque chose dans une sous-requête, car le tri est rejeté immédiatement après (par le standard SQL). –

Répondre

3

Requête:

SELECT table_id, series_id, revision_id, year 
FROM tableName t INNER JOIN 
    (SELECT revision_id, max(year) AS year 
    FROM tableName 
    WHERE series_id = 2 
    GROUP BY revision_id) s 
USING (revision_id, year) 
WHERE series_id = 2; 

Résultat:

table_id | series_id | revision_id | year 
----------+-----------+-------------+------ 
     2 |   2 |   1 | 2009 
     4 |   2 |   2 | 2009 
     5 |   2 |   3 | 2010 
(3 rows) 
2

Hmm ... Essayez ceci:

SELECT * 
FROM table as a 
WHERE series_id = ? 
AND year = (SELECT MAX(year) 
      FROM table as b 
      WHERE a.series_id = b.series_id 
      AND a.revision_id = b.revision_id) 
Questions connexes