如何在SQL中实现同月份分组内首行与其他行价格差值计算且首行返回NULL
问题原因
- 原逻辑中当月首行价格和自身做差结果为0,没有做特殊处理
- 窗口函数未指定
ORDER BY规则,部分数据库会返回不确定的首行值,存在逻辑隐患
解决方案
使用NULLIF函数将差值为0的结果转为NULL,同时补全窗口排序规则,修改后的语句如下:
SELECT date, price, NULLIF(ABS(FIRST_VALUE(price) OVER ( PARTITION BY DATE_TRUNC('month', date) ORDER BY date ASC ) - price), 0) AS first_value FROM Trade;
逻辑说明
PARTITION BY DATE_TRUNC('month', date)按月份分组的逻辑保持不变- 新增
ORDER BY date ASC保证每个月分组内按日期升序排列,取到的首行固定为当月最早日期的对应价格 NULLIF(差值, 0)会在差值等于0(对应当月首行)时返回NULL,其余情况返回实际差值,完全匹配预期输出
内容的提问来源于stack exchange,提问作者Md. Shamiul Islam
相关产品推荐
相关产品推荐

