如何仅从 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 一书中阅读有关此技术的更多信息,这是我学到的。
这里是简化的 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 一书中阅读有关此技术的更多信息,这是我学到的。