所以我本質上是在更改日志中添加一個事件。假設我有一個看起來像這樣的初始變更日志。
變更日志表:
| ID | 時間戳 | 狀態 |
|---|---|---|
| 1 | 10 | 一個 |
| 1 | 20 | 乙 |
| 1 | 30 | C |
| 2 | 10 | 一個 |
| 2 | 20 | 乙 |
我還有一個如下所示的事件表:
| ID | 時間戳 | 事件 |
|---|---|---|
| 1 | 25 | α |
| 2 | 15 | α |
我正在嘗試將事件表中的行添加到更改日志表中,以便最終表看起來像這樣
| ID | 時間戳 | 狀態 | 事件 |
|---|---|---|---|
| 1 | 10 | 一個 | 無效的 |
| 1 | 20 | 乙 | 無效的 |
| 1 | 25 | 乙 | α |
| 1 | 30 | C | 無效的 |
| 2 | 10 | 一個 | 無效的 |
| 2 | 15 | 一個 | α |
| 2 | 20 | 乙 | 無效的 |
我遇到的困難是在我要添加的行上,我需要用上一行的狀態或在我要添加的行的時間戳之前使用最新時間戳的行來填充狀態。例如,我不能簡單地使用當前狀態。
這可以使用SQL來實作嗎?
此刻,我只是為添加的事件保留狀態為空,這不是我想要的。
SELECT
*,
null as event
FROM changelog
UNION
SELECT
*,
null as state
FROM event
我正在使用 PostgreSQL
uj5u.com熱心網友回復:
一種選擇是使用UNION陳述句合并兩個表。COALESCE然后,您可以使用視窗函式將“狀態”列中的空值(使用函式)轉換為最后一個“狀態”值,該LAG視窗函式將對每個不同 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
在這里試試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484628.html
標籤:sql PostgreSQL
上一篇:SQLAlchemy不插入默認值
