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

时间:2018-10-02 07:18:33

标签: mysql sql

我有一个名为“ 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 个答案:

答案 0 :(得分:1)

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;

enter image description here

Demo

您当前的尝试有一个问题,因为它会找到quarter的最大值而与特定年份无关。也就是说,即使两家公司各自最近的年份(4)的最大季度实际上是2,也可以找到两家公司的最大季度2009。我通过形成一个十进制年份来解决这个问题。 ,例如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

答案 1 :(得分:0)

使用相关子查询

    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

答案 2 :(得分:0)

我会简单地做:

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
                            );

Here是一个学期。

我想不出一种更简单的方法来实现这一目标。并且使用(company, year, quarter)上的索引,它应该比替代方法具有更好的性能。