Select 第 1 列第 2 列的最大值

Select the highest value of column 2 per column 1

给出以下 table P_PROV

+----+-----------+-----------+
| id | date      | person_id |
+----+-----------+-----------+
| 1  |19/06/2019 | 1         |
| 2  |18/07/2010 | 2         |
| 3  |19/06/2020 | 1         |
| 4  |17/06/2020 | 2         |
| 5  |28/06/2020 | 3         |
+----+-----------+-----------+

我想要这个输出

+----+-----------+-----------+
| id | date      | person_id |
+----+-----------+-----------+
| 3  |19/06/2020 | 1         |
| 4  |17/06/2020 | 2         |
| 5  |28/06/2020 | 3         |
+----+-----------+-----------+

换句话说,我想 return 每个人的最大日期。我试过这样的东西

SELECT DISTINCT pp.date, pp.id FROM P_PROV pp
            WHERE (SELECT MAX(aa.date) 
            FROM P_PROV aa) = pp.date;

这只是 return 一行(当然,因为 MAX 只会 return 最大日期),但我真的不知道如何处理这个问题,任何将不胜感激

ROW_NUMBER 提供了一种处理方法:

SELECT id, date, person_id
FROM
(
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY date DESC) rn
    FROM yourTable t
) t
WHERE rn = 1;

Oracle 有一种使用聚合来完成此操作的有趣方法:

select max(id) keep (dense_rank first order by date desc) as id,
       max(date) as date, person_id
from P_PROV
group by person_id;

鉴于您的 ID 正在增加,这可能也符合您的要求:

select max(id) as id, max(date) as date, person_id
from P_PROV
group by person_id;