如何在SQL日志查询中仅返回各位置-物品的最新计数记录?
解决同一位置物品仅保留最新计数记录的问题
原查询会返回指定日期内同一LOCATION和ITEM的所有计数记录,但只有最新的QuantityCalc值是准确的,导致主查询SUM计算出现偏差。可以通过**窗口函数ROW_NUMBER()**实现仅保留每组最新条目的需求,修改后的查询如下:
WITH RankedLogs AS ( SELECT LOCATION, ITEM, SUM(CASE WHEN ACTION = 'COUNT-OK' THEN QUANTITY ELSE QUANTITY * CHANGE -- ACTION非OK时调整数量 END) AS QuantityCalc, DATE_TIME, -- 按位置和物品分组,每组内按时间倒序排名 ROW_NUMBER() OVER (PARTITION BY LOCATION, ITEM ORDER BY DATE_TIME DESC) AS RowNum FROM LOG_TABLE WHERE ACTION IN ('COUNT-ADJ','COUNT-OK') AND CAST(DATE_TIME AS DATE) = @CountDate GROUP BY LOCATION, ITEM, DATE_TIME ) SELECT LOCATION, ITEM, QuantityCalc, DATE_TIME FROM RankedLogs WHERE RowNum = 1 -- 仅保留每组的第一条(最新记录) ORDER BY DATE_TIME DESC;
核心逻辑说明:
- 用CTE
RankedLogs对原查询结果做分组排名:PARTITION BY LOCATION, ITEM将数据按位置+物品组合拆分,ORDER BY DATE_TIME DESC让每组内最新的记录排第1位 - 最后筛选
RowNum = 1的记录,直接得到每个LOCATION+ITEM组合的最新准确计数
内容的提问来源于stack exchange,提问作者oreadwin
相关产品推荐
相关产品推荐

