我有一个包含组织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。希望这是有道理的。
提前致谢。
答案 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