使用 SQL 将行添加到 select 语句并根据时间戳连接数据

Use SQL to add rows to a select statement and join data based upon timestamps

所以我实际上是在向更新日志中添加一个事件。假设我有一个看起来像这样的初始变更日志。

更新日志table:

id timestamp state
1 10 A
1 20 B
1 30 C
2 10 A
2 20 B

我还有一个活动 table 看起来像这样:

id timestamp event
1 25 alpha
2 15 alpha

我正在尝试将事件 table 中的行添加到变更日志 table 以便结尾 table 看起来像这样

id timestamp state event
1 10 A null
1 20 B null
1 25 B alpha
1 30 C null
2 10 A null
2 15 A alpha
2 20 B null

我遇到的困难是在我要添加的行上.我不能简单地使用例如当前状态。

这可以使用 SQL 实现吗?

此刻我只是让添加的事件的状态为空,这不是我想要的。

SELECT 
  *,
  null as event
FROM changelog
UNION
SELECT
  *,
  null as state
FROM event

我正在使用 PostgreSQL

一个选项是使用 UNION 语句合并两个表。然后,您可以使用 LAG window 函数将“state”列中的空值(使用 COALESCE 函数)转换为最后一个“state”值,该函数将按时间戳排序对于每个不同的 ID。

WITH cte AS (
    SELECT id, timestamp, state, null AS event FROM changelog_
    UNION
    SELECT id, timestamp, null AS state, event FROM events_
)
SELECT id,
       timestamp,
       COALESCE(state, 
                LAG(state) OVER(PARTITION BY id
                                ORDER     BY timestamp)) AS state,
       event
FROM cte

试试看 here.