我有一个表,它有文件名,每个文件的时间戳范围如下:
filename mindatetime maxdatetime
monitor_4.dat 2019-04-28 09:00:00 AM 2019-04-29 11:00:00 AM
monitor_4.dat 2019-04-28 11:00:00 AM 2019-04-29 18:00:00 PM
monitor_4.dat 2019-04-28 09:30:00 AM 2019-04-29 23:00:00 PM
monitor_5.dat 2019-04-28 07:00:00 AM 2019-04-28 10:00:00 AM
monitor_5.dat 2019-04-28 02:00:00 PM 2019-04-28 06:00:00 PM
monitor_5.dat 2019-04-28 09:00:00 AM 2019-04-28 03:00:00 PM
monitor_7.dat 2019-04-21 03:06:26.0 AM 2019-05-21 03:06:10.0 AM
monitor_7.dat 2019-05-21 03:06:10.001 AM 2019-05-24 03:06:11.0 AM
monitor_7.dat 2019-06-05 03:06:18.001 AM 2019-06-06 03:06:11.0 AM
monitor_7.dat 2019-05-24 03:06:11.001 AM 2019-06-05 03:06:18.0 AM
monitor_7.dat 2019-05-12 07:00:10.001 AM 2019-05-13 10:00:10.000 AM
monitor_7.dat 2019-05-15 09:30:10.001 AM 2019-05-18 11:30:10.000 AM
我需要删除多余的时间戳范围,即>属于给定时间戳范围的那些。
在本例中,对于“monitor_5.dat”文件,我们需要mindatetime为7AM,maxdatetime为6PM,因为它们构成了覆盖其他条目的逻辑最小和最大时间戳范围。
所以我的结果应该是:
filename mindatetime maxdatetime
monitor_4.dat 2019-04-28 09:00:00 AM 2019-04-29 23:00:00 PM
monitor_5.dat 2019-04-28 07:00:00 AM 2019-04-28 06:00:00 PM
monitor_7.dat 2019-04-21 03:06:26.0 AM 2019-06-05 03:06:18.0 AM
monitor_7.dat 2019-05-12 07:00:10.001 AM 2019-05-13 10:00:10.000 AM
monitor_7.dat 2019-05-15 09:30:10.001 AM 2019-05-18 11:30:10.000 AM
这只需要通过SQL来实现。任何建议都会有帮助的。我已经探索了Postgres中提供的“tsrange”函数,但这并不能完全帮助我。
最佳答案
这个答案只针对PostgreSQL;您是否故意标记MySQL?
您必须将表与自身联接,并删除其他项中包含的项:
DELETE FROM mytable AS a
USING mytable AS b
WHERE a.filename = b.filename
AND tsrange(a.mindatetime, a.maxdatetime) <@ tsrange(b.mindatetime, b.maxdatetime)
AND (a.ctid, a.xmin::text) <> (b.ctid, b.xmin::text);
最后一个条件防止将行与自身进行比较。