如何仅从 table 获取最近一年的所有数据,而许多行可能与那一年相关联

How to get all data from a table only for the latest year, while many rows may be associated with that year

这里是简化的 table:

id - company_id - report_year - code

1  - 123456     - 2013        - ASD  
2  - 123456     - 2013        - SDF  
3  - 123456     - 2012        - ASD  
4  - 123456     - 2012        - SDF 

我想获取指定 company_id 可用的最高 report_year 的所有代码。

所以我应该得到:

1 - 123456 - 2013 - ASD  
2 - 123456 - 2013 - SDF

但我不能硬编码WHERE year = 2013,因为对于某些公司来说,最新的报告年份可能是 2012 年或 2009 年。所以我需要根据可用的最新年份获取数据。

到目前为止我有这样的查询:

SELECT id, company_id, report_year, code,
FROM `my_table`
WHERE company_id= 123456

我试过group by和max()的一些混合,但我无法得到我需要的,这是我第一次遇到这样的请求,它令人困惑。

有什么想法吗?我正在使用 mysql.

您可以使用同一 table 上的联接来执行此操作,returns 每个公司的最大年份如下:

select my_table.id, my_table.company_id, my_table.report_year, my_table.code
from my_table
inner join (
    select max(report_year) as maxYear, company_id
    from my_table
    group by company_id
) maxYear ON my_table.report_year = maxYear.maxYear
    and my_table.company_id = maxYear.company_id

要将此限制为特定公司,只需添加您的 where 子句:

select my_table.id, my_table.company_id, my_table.report_year, my_table.code
from my_table
inner join (
    select max(report_year) as maxYear, company_id
    from my_table 
    where my_table.company_id= 123456
    group by company_id
) maxYear ON my_table.report_year = maxYear.maxYear
    and my_table.company_id = maxYear.company_id

使用相关子查询查找公司的最新年份:

SELECT id, company_id, report_year, code,
FROM `my_table` t1
WHERE company_id = 123456
  AND report_year = (select max(report_year)
                     from `my_table` t2
                     where t1.company_id = t2.company_id)

通常,反连接比使用子查询产生更好的性能:

SELECT t1.id, t1.company_id, t1.report_year, t1.code
FROM `my_table` t1
LEFT JOIN `my_table` t2
ON t2.company_id = t1.company_id AND t2.report_year > t1.report_year
WHERE t1.company_id = 123456 AND t2.report_year IS NULL

为获得最佳性能,请确保在 (company_id、report_year) 上有一个多列索引。

您可以在 SQL Antipatterns 一书中阅读有关此技术的更多信息,这是我学到的。