通过查询中的两列获取最新记录

wfsdck30  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(335)

我有一个名为“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
iqjalb3h

iqjalb3h1#

使用共同相关子查询

select year, company,max(id),max(quarter) from reports t
   where t.year in ( 
      select max(year)
     from reports t1 
    where t1.company=t.company 
        group by t1.company
                   )
                   group by year,company
hmmo2u0o

hmmo2u0o2#

我只想做:

select t.*
from t
where (t.year, t.quarter) = (select t2.year, t2.quarter
                             from t t2
                             where t2.company = t.company
                             order by t2.year desc, t2.quarter desc
                             limit 1
                            );

这是一个测试仪。
我想不出比这更简单的方法了。还有一个索引 (company, year, quarter) ,这应该比备选方案有更好的性能。

baubqpgj

baubqpgj3#

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;

演示

您当前的尝试有问题,因为它将找到的最大值 quarter 不管是哪一年。也就是说,它会找到 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;

演示

相关问题