如何在SQL Server中统计history表内商品的调价及降价次数?
统计商品调价次数的解决方案
嘿,我来帮你搞定这个调价次数统计的问题!首先咱们得先明确核心:你要的调价次数,本质是商品售价发生变动的次数,和markdown字段是否为'0'无关——毕竟你提到就算markdown是'0',售价也可能在几周内变化,对吧?
核心思路
要统计调价次数,关键是追踪每个商品的历史售价变化:对于同一个商品,只要当前记录的售价和上一条记录的售价不一样,就算一次调价。我们可以用SQL的窗口函数LAG()来实现这个逻辑。
假设表结构
先假设你的history表至少包含这些核心字段:
product_id:唯一标识每个商品的IDprice:商品的售价(数值类型,比如DECIMAL)record_date:记录这条价格信息的时间/日期(用来按时间顺序排序历史数据)
具体SQL实现
-- 第一步:为每条记录添加上一条的售价 WITH price_change_tracking AS ( SELECT product_id, price, -- 按商品分组,按记录时间排序,获取上一条的售价 LAG(price) OVER (PARTITION BY product_id ORDER BY record_date) AS previous_price FROM history ) -- 第二步:统计每个商品的调价次数 SELECT product_id, COUNT(*) AS price_adjustment_count FROM price_change_tracking WHERE previous_price IS NOT NULL -- 排除商品的第一条记录(没有上一条可对比) AND price != previous_price -- 只统计售价发生变化的情况 GROUP BY product_id;
关键细节说明
- 为什么用
LAG()?
这个窗口函数能帮我们在同一个商品的分组里,获取到当前记录的上一条记录的售价,这样就能直接对比价格是否变化。 - 处理特殊情况
- 如果你的
record_date可能存在重复(比如同一时间有多条价格记录),可以在ORDER BY里再加一个唯一字段(比如表的主键id),保证排序绝对准确:ORDER BY record_date, id - 如果
price可能出现NULL值,需要调整WHERE条件来覆盖这种情况:WHERE previous_price IS NOT NULL AND (price != previous_price OR (price IS NULL AND previous_price IS NOT NULL) OR (price IS NOT NULL AND previous_price IS NULL))
- 如果你的
- 完全忽略
markdown字段
因为你提到markdown为'0'时售价也可能变动,所以这个统计逻辑完全不依赖markdown的值,只看售价的实际变化,确保统计结果准确。
内容的提问来源于stack exchange,提问作者JK1993
相关产品推荐
相关产品推荐

