PostgreSQL选择上次更新的类别类型

时间:2010-12-04 04:16:29

标签: sql postgresql

我有一个表cars,其中包含make modelupdate_at字段。

updated_at是DateTime

make    | model     | updated_at
----------------------------------
Ford    | Fiesta    | 12-Jan-2010
Chevy   | Sliverado | 13-Jan-2010
Ford    | Focus     | 13-Jan-2010

我想找到每个品牌的最后更新车型:

make    | model     | updated_at
---------------------------------
Chevy   | Sliverado | 13-Jan-2010
Ford    | Focus     | 13-Jan-2010

通常我只会group by但是如果我按make分组,则在postgresql中我必须在group by或聚合函数中包含任何其他选定的列。

我如何得到我想要的结果。

1 个答案:

答案 0 :(得分:4)

PostgreSQL 8.4 +:

WITH sample AS (
   SELECT t.make,
          t.model,
          t.updated_at,
          ROW_NUMBER() OVER(PARTITION BY t.make
                                ORDER BY t.updated_at DESC) AS rank
     FROM CARS t)
SELECT s.make,
       s.model,
       s.updated_at
  FROM sample s
 WHERE s.rank = 1

8.4之前的PostgreSQL:

这使用了自联接,但问题是,如果make有两个或更多具有相同最大updated_at值的模型,您将获得重复:

SELECT x.make,
       x.model,
       x.updated_at
  FROM CARS x
  JOIN (SELECT t.make,
               MAX(t.updated_at) AS max_date
          FROM CARS t
      GROUP BY t.make) y ON y.make = x.make
                        AND y.max_date = x.updated_at