我的数据库里有两张桌子: 1-定期服务 2--实现服务.

在第二张表中,我有服务收到的价值$和服务实现的日期. 在第一个表中,我只有计划的日期,没有值.

重点是: 有时预定服务无法完成,必须重新安排,因此实现日期可能与预定日期不同. 但是,即使这项服务没有实现,我也想知道每天预定的费用是多少. 我已经创建了一个视图(Vw_Test),如下所示:

大众测试:
SELECT
    t1.date,
    t1.service,
    t2.value
FROM
    scheduled AS t1
LEFT JOIN
    realized AS t2
ON CONCAT(t1.date, t1.service) = CONCAT(t2.date, t2.service)
ORDER BY
    t1.service ASC,
    t2.date ASC

大众测试:

date service value
2023-04-01 A Null
2023-04-02 A Null
2023-04-03 A Null
2023-04-04 A Null
2023-04-05 A Null
2023-04-06 A Null
2023-04-07 A 150.80
2023-04-08 A Null
2023-04-09 A Null
2023-04-10 A Null
2023-04-01 B Null
2023-04-02 B Null
2023-04-03 B 247.17
2023-04-04 B Null
2023-04-05 B Null
2023-04-06 B Null
2023-04-07 B Null
2023-04-08 B 75.12
2023-04-09 B Null
2023-04-10 B Null

我正在try 使用下一个非Null值填充Null值,并在每个服务的Non-Null值之后保留Null,如下表所示:

date service value
2023-04-01 A 150.80
2023-04-02 A 150.80
2023-04-03 A 150.80
2023-04-04 A 150.80
2023-04-05 A 150.80
2023-04-06 A 150.80
2023-04-07 A 150.80
2023-04-08 A Null
2023-04-09 A Null
2023-04-10 A Null
2023-04-01 B 247.17
2023-04-02 B 247.17
2023-04-03 B 247.17
2023-04-04 B 75.12
2023-04-05 B 75.12
2023-04-06 B 75.12
2023-04-07 B 75.12
2023-04-08 B 75.12
2023-04-09 B Null
2023-04-10 B Null

这可以通过PostgreSQL实现吗? 我已经try 过text中提到的ARRAY_AGG 和JSONB_AGG text 但结果与大众测试相同.

谢谢你的帮助

推荐答案

对于这一点,我会使用缺口和岛屿的方法.

我知道vw_test美元对你来说是个不错的 Select .我简化了我的例子,把它做成一张表:

with realizeds as (
  select *, 
         (value is null and lag(value) over w is not null)::int as realized
    from vw_test 
  window w as (partition by service order by date)
), islands as (
  select *, 
         sum(realized) over w as group_num
    from realizeds
  window w as (partition by service order by date)
)
select *, max(value) over w as realized_value
  from islands
window w as (partition by service order by date
          rows between current row and unbounded following);

我将中间列留在其中是为了说明查询是如何工作的.

Working example.

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

查询多个表并返回合并在联合列上的所有表中的所有行

SQL是否可以计算每年的所有日期变化?

Access 365将文本转换回BigInt

SQL:计算与另一列中给定值互斥的匹配项

如何查找所提供日期范围的所有季度开始日期和结束日期

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

如何实现同一列的递归计算?

按连续相等值分组排序

Postgres SQL查询从字符串中获取邮箱地址

排除具有部分匹配条件的记录

在 Postgres 中将结果按几十年划分

连续天跟踪购买情况(将标记返回到另一列?)

BigQuery数组是否包含NULL值的判断方法

SQL Server: 将JSON对象数组转换为表格格式

SQL 按 id 运行总计并受条件限制(在窗口上)

使用 PL/PGSQL 函数 Select 返回多条记录

String_Split 多列

过滤具有一对多关系的两个表之间的数据

Amazon Redshift - 子计划的哈希表不存在