如何在SQL Server中获取每个客户的最近5个预测日期?
解决SQL查询获取每个客户最近5个预测日期的问题
原查询的问题
你当前的查询逻辑完全不符合需求:
- 窗口函数的
PARTITION BY Plant, ForecastDate是按工厂+预测日期分组,这和“按客户分组取最近日期”的目标无关 ORDER BY Customer DESC是按客户名称排序,不是按日期的新旧排序- 最后过滤
ROW_NUM = 1只会取每个工厂+日期组里的第一个客户,完全达不到获取每个客户最近5个日期的效果
正确的查询写法
要实现每个客户(结合工厂,若客户和工厂关联)的最近5个预测日期,且保留同一日期的所有行,需要用DENSE_RANK()按客户分组、按日期倒序排名,再筛选排名前5的日期对应的所有数据:
SELECT Customer, Plant, ForecastDate, Quantity -- 按需保留需要的字段 FROM (SELECT *, -- 按客户+工厂分区,预测日期从新到旧排名,同一日期的行排名相同 DENSE_RANK() OVER (PARTITION BY Customer, Plant ORDER BY ForecastDate DESC) AS DateRank FROM YourTableName -- 替换成你的实际表名 ) AS T WHERE DateRank <= 5;
逻辑说明
PARTITION BY Customer, Plant:确保是按每个客户+工厂的组合来统计最近日期(如果你的业务中客户和工厂是一一对应或需要按工厂区分客户,保留Plant;若不需要,只写Customer即可)ORDER BY ForecastDate DESC:让最新的预测日期排名为1,依次往后DENSE_RANK():同一预测日期的所有行会得到相同的排名,这样筛选DateRank <=5时,某个客户的第5个最近日期的所有行都会被保留,符合你“保留同一日期多行数据用于对比”的需求
内容的提问来源于stack exchange,提问作者zExcel
相关产品推荐
相关产品推荐

