我有一個表格,其中包含以 24 小時為周期定義的每一天。
CREATE TABLE periods (
id serial4 NOT NULL,
name varchar(10) NOT NULL,
period_time time NOT NULL
CONSTRAINT pk_period PRIMARY KEY (id),
);
我的目標是檢索每個時期的開始和結束日期,如下所示:
| begin | end | name |
|07:00:00|13:00:00| morning |
|13:00:00|20:00:00| afternoon |
|20:00:00|07:00:00| evening |
我已經完成了一個查詢,但我很確定有更聰明的方法來做到這一點,因為我使用兩個左連接來填充由于第一個左連接條件而具有空值的最新時期:
select p.period_time, coalesce(next_period.period_time,first_period.period_time), p.name
from periods p
left join lateral (
select period_time
from periods p2
where p2.period_time > p.period_time
order by period_time
limit 1
) as next_period on true
left join lateral (
select period_time
from periods p2
where p2.period_time >= '00:00:00'
limit 1
) as first_period on true
order by p.period_time
有什么建議 ?
性能是關鍵,因為這可以集成到內部子查詢中,而且我無法更改表定義。
uj5u.com熱心網友回復:
您可以嘗試使用檔案3.5 中描述的視窗函式。視窗函式和9.22。視窗函式:
SELECT p.period_time AS begin, lead(p.period_time) OVER (order by p.period_time) AS end, p.name
FROM periods p
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336009.html
標籤:sql PostgreSQL
