Mysql组通过选择最近的记录

时间:2018-04-09 14:17:17

标签: mysql greatest-n-per-group

我有一个包含组织ID的报告表,每年有多行,例如。

| ID | Organisation ID | Report Year 
--------------------------------------
|  1 |   1             | 2016        
|  2 |   1             | 2017        
|  3 |   12            | 2016        
|  4 |   12            | 2017        
|  5 |   13            | 2016        
|  6 |   13            | 2017        
|  7 |   14            | 2016        

和report_files表如下

| ID | Report Type ID | Report ID   | Report File
---------------------------------------------------
|  1 | 1              | 1          | org1_test_report_2016.pdf
|  3 | 1              | 3          | org1_test_report_2016.pdf
|  5 | 1              | 5          | org1_test_report_2016.pdf
|  6 | 1              | 6          | org1_test_report_2017.pdf
|  7 | 1              | 7          | org1_test_report_2016.pdf

我想从报告表中获取最新记录,即如果存在2016年和2017年的行,我想要2017年,如果只有2016年存在,那么得到它并将其连接到reports_file表上获取带有文件名的report_file列(如果该ID不存在,则返回null)。这样的事情。

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

可能没有正确解释,如果问题不明确,请告诉我。基本上希望按报告表上的organisation_id进行分组但是获取最新的行,如果2017存在则获取,如果没有获得2016,然后在report_files表上将其加入,以查看文件是否附加到最新的报告ID,如果是返回文件else返回null。希望这是有道理的。

提前致谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND A.Latest_Report_Year=B.Report_Year
JOIN report_files C ON B.ID=C.Report_ID;

SQL Fiddle上看到它。

答案 1 :(得分:1)

根据您希望的结果,我想在选择LEFT JOIN之后在中间表上执行MAX(Report_Year)

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND
A.Latest_Report_Year=B.Report_Year
LEFT JOIN report_files C ON B.ID=C.Report_ID;

结果:

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

SQL Fiddle here