使用 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.
所以我实际上是在向更新日志中添加一个事件。假设我有一个看起来像这样的初始变更日志。
更新日志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.