为含GROUP BY的MAX查询设置上限,实现按公司分组取最新记录
解决方案:分组取最新记录并添加限制
首先,先帮你完善基础的「按company_id分组,筛选每个公司最大periods对应记录」的查询,再给你两种添加限制的方案:
1. 基础查询(无限制)
用INNER JOIN关联子查询的方式,先获取每个公司的最新periods,再匹配原表的完整记录:
SELECT sr.* FROM salesreport sr INNER JOIN ( -- 子查询:按公司分组,拿到每个公司的最大periods SELECT company_id, MAX(periods) AS max_period FROM salesreport GROUP BY company_id ) AS latest ON sr.company_id = latest.company_id AND sr.periods = latest.max_period;
2. 添加限制的两种场景
场景1:限制返回的公司数量
如果你只想获取前N个公司的最新记录(比如前2个),可以在子查询中添加LIMIT,还可以配合ORDER BY按最新时间排序选取:
SELECT sr.* FROM salesreport sr INNER JOIN ( SELECT company_id, MAX(periods) AS max_period FROM salesreport GROUP BY company_id ORDER BY max_period DESC -- 按最新periods排序,优先取最近的公司 LIMIT 2 -- 设置要限制的公司数量 ) AS latest ON sr.company_id = latest.company_id AND sr.periods = latest.max_period;
如果不需要排序,直接去掉ORDER BY即可,会随机返回N个公司的记录。
场景2:限制每个公司的返回条数(或总记录数)
如果存在同一公司有多条记录的periods等于最大值的情况(比如某公司同一天有多条销售数据),或者你想限制总返回的记录数,用窗口函数会更灵活:
SELECT id, company_id, price, periods FROM ( SELECT *, -- 按公司分组,按periods倒序给每条记录排名 ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY periods DESC) AS rn FROM salesreport ) AS ranked WHERE rn = 1 -- 只保留每个公司排名第一的记录(即最新periods的那条) LIMIT 3; -- 可选:限制总返回的记录数量
这个方案的优势是:
- 可以轻松控制每个公司返回的记录数(比如把
rn <= 2改成返回每个公司前2条最新记录) - 外层的
LIMIT可以直接限制最终返回的总条数
内容的提问来源于stack exchange,提问作者PamanBeruang
相关产品推荐
相关产品推荐

