0

给定下表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         |
+----+-----------+-----------+

换句话说,我想为每个人返回最大日期。我尝试过这样的事情

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

这个只返回一行(当然,因为 MAX 只会返回最大日期),但我真的不知道如何解决这个问题,任何形式的帮助都将不胜感激

4

2 回答 2

0

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;
于 2020-06-23T12:06:49.090 回答
0

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;
于 2020-06-23T03:07:47.353 回答