我在表格中以每个用户的不同单位花费了时间段。时间段重叠,我想解决这个问题。我有:
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');
答案 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