我得到了一個資料表,其中記錄了某些專案的歷史記錄。這些專案隨著時間的推移而演變,并通過不同的狀態,如“已提交”、“正在驗證”、“已完成”:
| ID | 修改日期 | 地位 |
|---|---|---|
| 123 | 01.01.2021 12:01 | 已提交 |
| 123 | 02.01.2021 12:02 | 驗證中 |
| 123 | 03.01.2021 12:03 | 完全的 |
| 345 | 06.01.2021 12:04 | 已提交 |
| 345 | 04.01.2021 12:05 | 驗證中 |
| 345 | 19.01.2021 18:06 | 完全的 |
我想知道每個專案處于特定狀態的天數。有沒有辦法用 PostgreSQL 做到這一點?
uj5u.com熱心網友回復:
您可以使用視窗函式來訪問以下行并計算 2 個欄位之間的差異。 https://www.postgresqltutorial.com/postgresql-lead-function/
如果沒有測驗,它應該看起來像這樣:
select *,
Datediff(dd,[Modified Date],lead([Modified Date],1,GETDATE())
over
(order by ID, [Modified Date])) as [Days between]
from log
order by ID, [Modified Date]
有了它,您可以從實際行中的表中獲得下一個值,您可以用它進行計算。對于默認值,實際使用了日期,但您可以使用其他所有您想要的日期。
uj5u.com熱心網友回復:
您可以使用決議函式LEAD()。在您的問題中不清楚狀態遵循特定的作業流程還是沒有意義,因此下面的查詢是通用的。
你可以做:
select *,
lead(modified_date) over(partition by id order by modified_date)
- modified_date as diff
from t
結果:
id modified_date status diff
---- ------------------------- ---------------- ----------------------------------
123 2021-01-01T12:01:00.000Z SUBMITTED {"days":1,"minutes":1}
123 2021-01-02T12:02:00.000Z IN_VERIFICATION {"days":1,"minutes":1}
123 2021-01-03T12:03:00.000Z COMPLETED null
345 2021-01-04T12:05:00.000Z IN_VERIFICATION {"days":1,"hours":23,"minutes":59}
345 2021-01-06T12:04:00.000Z SUBMITTED {"days":13,"minutes":2}
345 2021-01-19T12:06:00.000Z COMPLETED null
請參閱DB Fiddle 上的運行示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/391764.html
標籤:sql PostgreSQL的
上一篇:在SQL中確定日歷周的日期范圍
下一篇:當前值小于以前的值
