我有一个表cars
,其中包含make
model
和update_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
或聚合函数中包含任何其他选定的列。
我如何得到我想要的结果。
答案 0 :(得分: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
这使用了自联接,但问题是,如果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