PostgreSQL,找到并修复重叠的时间段

时间:2016-04-04 14:59:45

标签: sql postgresql

我在表格中以每个用户的不同单位花费了时间段。时间段重叠,我想解决这个问题。我有:

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');

1 个答案:

答案 0 :(得分:0)

您并没有提供足够的信息来完全回答这个问题,正如其他人指出的那样,您可能会遇到特殊情况,因此您应该在运行更新之前仔细分析数据的样子。

但是在你的测试环境中你可以试试这样的东西。诀窍是将表连接到自己的子句,这些子句限制您正确匹配业务逻辑的数据,然后更新它。

此声明适用于您的小样本集,只是贯穿并机械设置结束时间到下一个时间段的开始时间。我之前在类似的问题上使用了类似的东西,所以我知道机制对你有用。

注意:除了这个小套装外,没有进行任何其他测试。不要运行生产数据!

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