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;
给出以下 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;