如何基于同日期不同月份对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
相关产品推荐
相关产品推荐

