如何从门店预算表中获取各门店当月的最新记录?
解决门店当月最新预算记录查询问题
我明白你的需求啦——你现在的查询能筛选出指定门店当月的所有预算记录,但如果某个门店当月有多条记录,你只想保留最新的那一条。下面给你两种实用的解决方案:
方法一:使用窗口函数(推荐,适用于支持窗口函数的数据库如MySQL 8+、PostgreSQL、SQL Server等)
窗口函数ROW_NUMBER()可以帮我们给每个门店的当月记录按日期倒序排名,然后只取排名为1的那条(也就是最新的):
WITH ranked_budgets AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY store ORDER BY Date DESC) AS rn FROM table_budget WHERE store IN ([$STORE$]) AND MONTH(Date) = MONTH(CURRENT_DATE()) AND YEAR(Date) = YEAR(CURRENT_DATE()) ) SELECT * FROM ranked_budgets WHERE rn = 1;
代码解释:
PARTITION BY store:按门店分组,每组内单独排序ORDER BY Date DESC:每组内按日期从新到旧排序,最新的记录会排第1rn = 1:只保留每个门店组里排名第一的记录
方法二:分组关联法(兼容老版本数据库)
如果你的数据库不支持窗口函数,可以先找出每个门店当月的最新日期,再关联原表获取完整记录:
SELECT b.* FROM table_budget b INNER JOIN ( SELECT store, MAX(Date) AS latest_date FROM table_budget WHERE store IN ([$STORE$]) AND MONTH(Date) = MONTH(CURRENT_DATE()) AND YEAR(Date) = YEAR(CURRENT_DATE()) GROUP BY store ) latest ON b.store = latest.store AND b.Date = latest.latest_date WHERE b.store IN ([$STORE$]) AND MONTH(b.Date) = MONTH(CURRENT_DATE()) AND YEAR(b.Date) = YEAR(CURRENT_DATE());
代码解释:
- 子查询先按门店分组,找出每个门店当月的最大(最新)日期
- 然后通过门店和日期关联原表,得到每个门店最新日期对应的完整记录
另外小提示:如果Date字段是带时间的datetime类型,两种方法都能正常工作,因为MAX(Date)和ORDER BY Date DESC都会考虑时间部分哦。
内容的提问来源于stack exchange,提问作者Akash
相关产品推荐
相关产品推荐

