You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中统计history表内商品的调价及降价次数?

统计商品调价次数的解决方案

嘿,我来帮你搞定这个调价次数统计的问题!首先咱们得先明确核心:你要的调价次数,本质是商品售价发生变动的次数,和markdown字段是否为'0'无关——毕竟你提到就算markdown是'0',售价也可能在几周内变化,对吧?

核心思路

要统计调价次数,关键是追踪每个商品的历史售价变化:对于同一个商品,只要当前记录的售价和上一条记录的售价不一样,就算一次调价。我们可以用SQL的窗口函数LAG()来实现这个逻辑。

假设表结构

先假设你的history表至少包含这些核心字段:

  • product_id:唯一标识每个商品的ID
  • price:商品的售价(数值类型,比如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;

关键细节说明

  1. 为什么用LAG()?
    这个窗口函数能帮我们在同一个商品的分组里,获取到当前记录的上一条记录的售价,这样就能直接对比价格是否变化。
  2. 处理特殊情况
    • 如果你的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))
      
  3. 完全忽略markdown字段
    因为你提到markdown为'0'时售价也可能变动,所以这个统计逻辑完全不依赖markdown的值,只看售价的实际变化,确保统计结果准确。

内容的提问来源于stack exchange,提问作者JK1993

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:36