2011-07-05 19 views
2

に最新のレコードを見つけるために、私はPostgreSQLのときシリーズ= X REVISION_IDによってグループ化されたときに最大(年)のためのtable_idを見つける必要があり、このようなSQLグループ

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 

のようなテーブルを持っています。

例:x = 2のiは、この結果

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

を期待していたときに、これは動作しません

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 
) 
私は返す必要があるため

私はPostgreSQLでこれを行う方法を把握することはできませんフィールド私はグループ化していません

ここに他の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

これらの問題の解決策は機能しません。 – OrangeDog

+0

mysqlでは、グループに含まれていないフィールドを選択できますが、これはポストグルでは許可されていません。 SQLサーバーのTOP1はサポートされていません。 –

+0

トップレコードのみを選んでいる場合を除いて、サブクエリの中で順序付けをすることはお勧めできません。ソートはすぐ後で(SQL標準によって)破棄されます。 –

答えて

3

問合せ:

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; 

結果:

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

うーん... はこれを試してみてください:

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)