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

如何基于同日期不同月份对SQL表中Price列进行差值计算?

跨月份同日期Price差值计算的SQL解决方案

核心思路

关联同数据类型(DataType)、同日期(日部分)的2023年10月与11月数据,直接计算两者Price的差值,最终保留10月的Datetime。

方案一:自连接实现

适用于需要严格匹配10月和11月均有数据的场景,若需保留10月无对应11月数据的记录,可将JOIN改为LEFT JOIN。

SELECT 
    t1.DataType,
    t1.Datetime,
    -- 可根据需求调整小数位数,示例保留2位
    ROUND(t1.Price - t2.Price, 2) AS Price_Diff
FROM 
    your_table t1
JOIN 
    your_table t2 ON 
        t1.DataType = t2.DataType
        AND DAY(t1.Datetime) = DAY(t2.Datetime)
        AND YEAR(t1.Datetime) = 2023 AND MONTH(t1.Datetime) = 10
        AND YEAR(t2.Datetime) = 2023 AND MONTH(t2.Datetime) = 11

方案二:CTE+分组聚合实现

适合灵活筛选月份、统一处理分组逻辑的场景,可轻松扩展到多月份对比。

WITH monthly_data AS (
    SELECT 
        DataType,
        Datetime,
        Price,
        DAY(Datetime) AS day_of_month,
        MONTH(Datetime) AS month_num
    FROM your_table
    WHERE YEAR(Datetime) = 2023 AND MONTH(Datetime) IN (10, 11)
)
SELECT 
    DataType,
    MAX(CASE WHEN month_num = 10 THEN Datetime END) AS Datetime,
    MAX(CASE WHEN month_num = 10 THEN Price END) - MAX(CASE WHEN month_num = 11 THEN Price END) AS Price_Diff
FROM monthly_data
GROUP BY DataType, day_of_month
-- 可选:仅保留有10月数据的记录,需保留全部10月记录可删除此行
HAVING MAX(CASE WHEN month_num = 10 THEN Price END) IS NOT NULL

注意事项

  • 日期函数需适配你的数据库:MySQL/SQL Server用DAY(),Oracle用EXTRACT(DAY FROM Datetime),PostgreSQL用EXTRACT(DAY FROM Datetime)或DATE_PART('day', Datetime)。
  • 若需将无对应11月数据的差值设为0,可使用COALESCE(计算表达式, 0)替换原差值字段。

内容的提问来源于stack exchange,提问作者Ahmad Fuad Jamaludin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:05:21