PostgreSQL:如何获得GROUP BY的max()?

时间:2019-08-13 16:30:45

标签: sql postgresql

我有一个名为 history 的表,其中包含字段 id 事件日期

它可以保存在我办公室工作的人员的事件,例如“进入办公室”,“离开办公室”,“疾病”,“假期”等。

我需要得到每个人的最后一个事件。

这是我尝试过的方法,但是不起作用:

SELECT lastname, event, max(date)
FROM personshistory
GROUP BY lastname, event;

2 个答案:

答案 0 :(得分:2)

您可以使用distinct on

select distinct on (lastname) ph.*
from personshistory
order by lastname, date desc;

distinct on是非常方便的Postgres扩展。它在括号中为表达式的每个值保留一行。特定行由order by子句确定-基于distinct on键后面的键。

答案 1 :(得分:0)

不存在:

SELECT p.lastname, p.event, p.date
FROM personshistory p
WHERE NOT EXISTS (
  SELECT 1 FROM personshistory
  WHERE lastname = p.lastname and date > p.date 
)

或将您的查询(无event列)添加到表中:

SELECT p.lastname, p.event, p.date
FROM personshistory p INNER JOIN (
  SELECT lastname, MAX(date) maxdate
  FROM personshistory
  GROUP BY lastname
) g on g.lastname = p.lastname and g.maxdate = p.date
相关问题