我有一个名为“ 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
答案 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;
您当前的尝试有一个问题,因为它会找到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;
答案 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)
上的索引,它应该比替代方法具有更好的性能。