mysql - 查询中按两列获取最新记录

标签 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

最佳答案

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

您当前的尝试有问题​​,因为它将找到季度的最大值,而不考虑特定年份。也就是说,它会发现两家公司的最大季度为 4,即使在各自最近的年份 (2009),最大季度实际上是 2。我解决了这是通过形成十进制年份来实现的,例如可以是2009.52009 第二季度。

从 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/

相关文章:

PHP : How can I synchronize one online sql database with another offline database?

mysql - 删除mySQL中已知其他列或未知其他列的具有N个外键的列

sql - 获取每个项目的最新价格

mysql - SQL 超出第 1 行 'CGPA' 列的值

当列包含 utf-8 字符时 MySQL 查询返回错误数据

php - 存储过程调用后 Codeigniter DB 错误

mysql - MySQL 中的多词搜索结果

php - 如何在 Laravel eloquent 的子查询中使用 "With"和条件?

MySQL-如何从3个表中获取数据?

sql - 将集合更新、插入或删除到表中