首页 > 解决方案 > 使用 SQL 修改/重新计算表(减少前瞻和后顾)

问题描述

以正确的方式命名问题非常困难,因为我有以下案例。考虑表:

A       B     C
1-Jan   0.1   1
2-Jan   0.1   0
3-Jan   0.5   0
4-Jan   0.3   1

这表示特定日期(A)有一定数量(B)的典型收入。并且有一个日期是周末的标志(C)。由于 1 月 2 日和 1 月 3 日是周末,我只能期望 1 月 4 日的相应金额,并且需要将上面的表格转换为以下表示(期望的结果):

A1      B1    C1
1-Jan   0.1 
4-Jan   0.1   02-Jan
4-Jan   0.5   03-Jan
4-Jan   0.3 

这显然表明我可能期望从 1 月 2 日和 3 日到 1 月 4 日的收入(这就是我有 C1 栏的原因)。总体逻辑是,每个周末估计都会添加到下一个工作日(向前看),除非该月的最后一天是周末,否则我必须将其值添加到最后一个工作日(向后看)。

用某种循环解决这个问题是可能的,我可以管理它。但是我很高兴知道是否有更有效的解决方案(一些东西,我可以在 SELECT 中放入 IF),因为数据量很大(也就是说,每天 D 列中有数千个值)。所以循环可能是相当昂贵的解决方案。此外,虽然有 C1 供参考和测试会很好,但只有 A1 和 B1 是绝对必要的。

我尽力在这里找到类似的主题,但是由于我不知道如何正确命名此解决方案(向前看主要是指Regex),所以我无法做到。提前致谢。

标签: sqlsql-servertsql

解决方案


您可以将选择运行为:

select min(case when c = 1 then a end) over (order by a desc) as a1,
       b as b1,
       (case when c = 0 then a end) as c1
from t;

是一个 db<>fiddle。


推荐阅读