我有一个名为“reports”的表,如下所示:
id company year quarter
1 A 2008 1
2 A 2008 2
3 A 2008 3
4 A 2008 4
5 A 2009 1
6 A 2009 2
7 B 2008 1
8 B 2008 2
9 B 2008 3
10 B 2008 4
11 B 2009 1
12 B 2009 2
该表包含年份和季度。每年有四个季度。最新记录由年份和季度栏确定。所以当年最高的年份和最高季度的记录就是最新的记录。 我想通过一次查询获得每家公司的最新报告。在本例中,这就是结果。
id company year quarter
6 A 2009 2
12 B 2009 2
我尝试使用以下查询来实现它:
select * from reports
inner join ( select company, max( year ) AS year, max( quarter ) AS quarter
from reports group by company ) as r
on r.company = reports.company
and r.year = reports.year
and r.quarter = reports.quarter
最佳答案
MySQL 8之前的方式使用子查询来识别每个公司的最新记录:
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT company, MAX(year + quarter / 4.0) AS max_year
FROM yourTable
GROUP BY company
) t2
ON t1.company = t2.company AND
(t1.year + t1.quarter / 4.0) = t2.max_year;
Demo
您当前的尝试有问题,因为它将找到季度
的最大值,而不考虑特定年份。也就是说,它会发现两家公司的最大季度为 4
,即使在各自最近的年份 (2009
),最大季度实际上是 2。我解决了这是通过形成十进制年份来实现的,例如可以是2009.5
为 2009
第二季度。
从 MySQL 8+ 开始,我们可以利用 ROW_NUMBER
分析函数:
SELECT id, company, year, quarter
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY company
ORDER BY year DESC, quarter DESC) rn
FROM yourTable
) t
WHERE t.rn = 1;
Demo
关于mysql - 查询中按两列获取最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52603628/