我需要为另一列中的公共ID选择一列中的最大金额。在report_id列中可能有几个具有相同的最大last_update数量的ID。
数据结构:
+------+-------+--------------------------------------------+
| id | report_id | last_update |
+------+-------------+--------------------------------------+
| 1 | 1 | 2019-01-24 |
| 2 | 1 | 2019-01-24 |
| 3 | 1 | 2019-01-24 |
| 4 | 2 | 2019-01-24 |
| 5 | 3 | 2019-01-23 |
+------+-------+--------------------------------------------+
到目前为止,我遇到的问题是我似乎无法仅通过report_id来隔离结果。例如,使用以下查询:
"SELECT report_id, last_update
FROM reports
WHERE last_update=(
SELECT MAX(last_update) FROM reports
WHERE report_id='1'
);
";
这将返回:
+------+-------+--------------------------------------------+
| id | report_id | last_update |
+------+-------------+--------------------------------------+
| 1 | 1 | 2019-01-24 |
| 2 | 1 | 2019-01-24 |
| 3 | 1 | 2019-01-24 |
| 4 | 2 | 2019-01-24 |
+------+-------+--------------------------------------------+
所以这几乎是正确的,但是它也包含了report_id 2,因为在last_update中它的最大值为2019-01-24。
我真正需要做的是选择report_id为1的所有列,然后仅使用MAX(last_update)从该结果集中选择行,但是我一直在研究每组nest-nth-per-group和相关问题在SO上,我只是拿不到这个。
每当我将MAX引入查询中时,似乎都可以否认我也试图通过report_id进行隔离。
答案 0 :(得分:1)
以下是一些解决方案:
元组比较:
library('lubridate')
dateToRetrieve = ymd('2017-11-05')
#output: [1] "2017-11-05"
monthFromDate = month(dateToRetrieve, year_start=11)
#output: [1] 1
使用派生表而不是依赖子查询进行元组比较:
period(10, units="month")
无子查询解决方案,使用排除联接查找没有其他报告具有相同report_id和更新日期更长的报告:
SELECT report_id, last_update
FROM reports
WHERE (report_id, last_update) = (
SELECT report_id, MAX(last_update) FROM reports
WHERE report_id='1'
GROUP BY report_id
);
具有窗口功能的MySQL 8.0解决方案:
SELECT report_id, last_update
FROM reports
INNER JOIN (
SELECT report_id, MAX(last_update) AS last_update
FROM reports WHERE report_id='1' GROUP BY report_id
) USING (report_id, last_update);