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

SQL Server如何获取商品前一日价格?现有查询未达预期求解决

获取SQL Server中商品的前一日价格(无记录时显示NULL)

问题分析

你当前使用LAG()函数的查询,只是按行顺序取同商品的上一条记录价格,但不会判断上一条记录的日期是否为当前日期的前一天。比如lux的2022-02-25记录,原查询会返回2022-02-23的价格,但实际上2022-02-24没有该商品的记录,此时应该显示NULL,这就是原查询不符合预期的原因。

解决方案

以下几种方法都可以实现需求:

方法1:LEFT JOIN关联前一日记录

通过自连接,明确匹配商品名相同且日期为前一天的记录:

SELECT 
    pd.productname,
    pd.productdate,
    pd.price,
    prev.price AS previousdayprice
FROM [dbo].[productdetails] pd
LEFT JOIN [dbo].[productdetails] prev
    ON pd.productname = prev.productname
    AND DATEADD(day, -1, pd.productdate) = prev.productdate
ORDER BY pd.productname, pd.productdate;

方法2:LAG()结合CASE判断日期连续性

保留LAG的逻辑,但增加日期判断,只有当上一条记录的日期是当前日期的前一天时,才返回价格,否则返回NULL:

SELECT 
    *,
    CASE 
        WHEN DATEADD(day, -1, productdate) = LAG(productdate) OVER (PARTITION BY productname ORDER BY productdate)
        THEN LAG(price) OVER (PARTITION BY productname ORDER BY productdate)
        ELSE NULL
    END AS previousdayprice
FROM [dbo].[productdetails]
ORDER BY productname, productdate;

方法3:OUTER APPLY查询前一日数据

使用OUTER APPLY为每一行单独查询对应商品前一天的价格,无记录时返回NULL:

SELECT 
    pd.*,
    prev.price AS previousdayprice
FROM [dbo].[productdetails] pd
OUTER APPLY (
    SELECT price 
    FROM [dbo].[productdetails]
    WHERE productname = pd.productname
      AND productdate = DATEADD(day, -1, pd.productdate)
) prev
ORDER BY pd.productname, pd.productdate;

以上三种方法执行后,都会得到符合你预期的结果:当商品对应前一日无记录时,previousdayprice字段显示NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:01:18