如何获得具有相同ID的多行的多个最大列值?

时间:2019-01-24 21:55:20

标签: mysql greatest-n-per-group

我需要为另一列中的公共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进行隔离。

1 个答案:

答案 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);