簡體   English   中英

PostgreSQL,查找並修復重疊的時間段

[英]PostgreSQL, finding and fixing overlapping time periods

我在表中每個用戶使用不同單位的時間段。 時間段重疊,我想解決這個問題。 我有:

user|unit|start_time|end_time
   1|   1|2015-01-01|2015-01-31
   1|   2|2015-01-07|2015-01-14
   2|   1|2015-01-09|2015-01-13
   2|   2|2015-01-10|2015-01-15

即。 用戶1在2015-01-01的單元1開始,在2015-01-07轉移到單元2,在2015-01-14返回到單元1,並在2015-01-31離開了單元1。 用戶不能一次處於兩個位置,因此該表應如下所示:

user|unit|start_time|end_time
   1|   1|2015-01-01|2015-01-07 --fixed end_time
   1|   2|2015-01-07|2015-01-14
   1|   1|2015-01-14|2015-01-31 --newly created line
   2|   1|2015-01-09|2015-01-10 --fixed end_time
   2|   2|2015-01-10|2015-01-15

這是一些使用一些條目創建測試表的SQL。

CREATE TABLE users_n_units
(
users character varying (100),
units character varying (100),
start_time date,
end_time date
);

INSERT INTO users_n_units (users,units,start_time,end_time) 
VALUES ('1','1','2015-01-01','2015-01-31'),
       ('1','2','2015-01-07','2015-01-14'),
       ('2','1','2015-01-09','2015-01-13'),
       ('2','2','2015-01-10','2015-01-15');

您實際上沒有提供足夠的信息來完全回答這個問題,並且正如其他人指出的那樣,您可能會遇到特殊情況,因此在運行更新之前,應仔細分析數據的外觀。

但是在測試環境中,您可以嘗試這樣的操作。 訣竅是使用一些子句將表連接到自身,這些子句將您限制在與業務邏輯正確匹配的數據上,然后對其進行更新。

該語句適用於您的小型樣本集,只是貫穿整個過程並以機械方式將結束時間設置為以下時間段的開始時間。 之前,我在類似問題上使用了與之非常相似的東西,所以我知道該機制應該對您有用。

小心:除此小型裝置外,未經測試。 不要運行生產數據!

UPDATE a SET a.end_time = b.start_time 
FROM users_n_units a 
INNER JOIN users_n_units b ON a.users = b.users AND a.units < b.units

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM