我有一个名为“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
3条答案
按热度按时间iqjalb3h1#
使用共同相关子查询
hmmo2u0o2#
我只想做:
这是一个测试仪。
我想不出比这更简单的方法了。还有一个索引
(company, year, quarter)
,这应该比备选方案有更好的性能。baubqpgj3#
mysql 8之前的方法使用子查询来标识每个公司的最新记录:
演示
您当前的尝试有问题,因为它将找到的最大值
quarter
不管是哪一年。也就是说,它会找到4
对两家公司来说,即使在最近几年(2009
),最大的四分之一实际上是2。我通过形成一个小数年来解决这个问题,这个小数年可以是,例如。2009.5
年第二季度2009
.从mysql 8+开始,我们可以利用
ROW_NUMBER
分析函数:演示