sql - 使用 SQL 进行表修改/重新计算(通过前瞻和回顾进行归约)

标签 sql sql-server t-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 月 4 日收到 1 月 2 日和 3 日的收入(这就是为什么我有 C1 列)。 总体逻辑是,每个周末的估计都会添加到下一个工作日(向前看),除非该月的最后一天是周末,那么我必须将其值添加到最后一个工作日(向后看)。

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

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

最佳答案

您可以运行选择:

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;

Here是一个数据库<> fiddle 。

关于sql - 使用 SQL 进行表修改/重新计算(通过前瞻和回顾进行归约),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66400335/

相关文章:

sql - 使用 Access VBA,如何计算选择查询中的输出记录数并将计数存储为 VBA 变量?

sql-server - 分组SQL Server请求

c# - 如何将复杂的 T-SQL 转换为 Linq

java - 在 JPA MySql 中存储与时区无关的时间的最佳方法

mysql - 定期删除 MySQL 表 A 行,但保留关联的表 B 数据,该数据根据表 A 的数据进行更新

c# - 在多个sql表之间进行选择

html - asp.net连接数据库读取数据

sql - 带有两个行终止符的 BULK INSERT

sql-server - 使用 SQL Server 中的一张表上的聚合函数更新查询

sql-server - T-SQL 将另一个字段中存在的连字符分隔值的平均值放入一个字段中