我有一个具有以下 struct 的PostgreSQL表:

CREATE TABLE cte1 (
    entity_id INT,
    assignedtogroup INT,
    time BIGINT
);

INSERT INTO cte1 (entity_id, assignedtogroup, time)
VALUES
    (1, 435198, 1687863949740),
    (1, 435198, 1687863949741),
    (1, NULL, 1687863949742),
    (1, NULL, 1687863949743),
    (1, 435224, 1687863949744),
    (1, 435224, 1687863949745),
    (1, 435143, 1687863949746),
    (1, 435143, 1687863949747),
    (1, 435191, 1687863949748),
    (1, NULL, 1687863949749),
    (2, 435143, 1690452125291),
    (2, 435143, 1690452125292),
    (2, 435191, 1690452125293),
    (2, NULL, 1690452125294);

我希望使用前一行的非空值(当前行之前的时间和相同的实体ID)来填充assignedtogroup列中的空值.预期结果应该是:

entity_id assignedtogroup time
1 435198 1687863949740
1 435198 1687863949741
1 435198 1687863949742
1 435198 1687863949743
1 435224 1687863949744
1 435224 1687863949745
1 435143 1687863949746
1 435143 1687863949747
1 435191 1687863949748
1 435191 1687863949749
2 435143 1690452125291
2 435143 1690452125292
2 435191 1690452125293
2 435191 1690452125294

有没有办法只使用一条SELECT语句来实现这一点呢?

我try 使用LAG函数:

SELECT
    entity_id,
    COALESCE(
        assignedtogroup,
        LAG(assignedtogroup) OVER (PARTITION BY entity_id ORDER BY time)
    ) AS filled_assignedtogroup
FROM cte1;

但是,我仍然有一个空值,并且对于实体id 2,值完全是混合的.

你可以找到DB小提琴:https://www.db-fiddle.com/f/m52Rgq8jtK85g9yvaDMJqz/3

推荐答案

在这里使用一个简单的关联,您会更好地使用IMO:

select Entity_Id, Coalesce(assignedtogroup, (
  select assignedtogroup 
    from cte1 cte2 where cte2.entity_id = cte1.entity_id 
      and cte2.time < cte1.time 
      and cte2.assignedtogroup is not null 
      order by time desc
    limit 1
  )), time
from cte1;

更新的数据库小提琴https://www.db-fiddle.com/f/m52Rgq8jtK85g9yvaDMJqz/3

Sql相关问答推荐

使用自动增量ID插入失败(无法将值空插入列ID)

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

如何使用PostGIS从单个表中 Select 所有相交面组

具有2个共享列的两个表的Amazon RSQL合并

在多个柱上连接时,如何确定连接条件?

计算周时出现SQL错误结果

将Dense_RANK列为聚合(非解析)函数(&A)

无法将发票与产品价格相关联

在UNION查询中查找MIN

组合2个分区表的postgres视图的执行计划正在访问所有分区

Select 最频繁的值以及分组依据

用另一个表中的特定名称替换 SQL 查询中的 ID.但我的两个表都有多个列

Grafana SQL 模板变量(值、文本)

从另一个没有公共键的表中获取值来加入

将时间戳四舍五入到最近 10 分钟的查询

通过ID和数据找到每个不同的值

基于变量的条件 WHERE 子句

如何更改 duckdb R 中的数据约束

如何从 2 个 SQLite 表构建嵌套对象?

我现在如何显示重复的汽车? postgresql