【发布时间】:2013-06-04 15:07:54
【问题描述】:
假设我有一些服务器,它们不断更新数据库的状态。
我需要针对这些服务器的状态生成一些报告。对桌子做一点清理工作会很有帮助。
每条状态消息(开始时间和结束时间)都有 2 个时间戳。我想做的是采取具有相同状态的后续更新,并将其删除。我想更新结束时间以反映正确的时间间隔。
让我举例说明...
server_status 表:
server | status | start_time | end_time
---------+------------+---------------------+---------------------
web1 | running | 2013-06-04 00:00:00 | 2013-06-04 00:05:00
web2 | down | 2013-06-04 00:01:00 | 2013-06-04 00:03:00
web1 | running | 2013-06-04 00:05:00 | 2013-06-04 01:00:00
msdb | idle | 2013-06-04 00:02:00 | 2013-06-04 02:00:00
web1 | running | 2013-06-04 01:00:00 | 2013-06-04 02:00:00
web2 | down | 2013-06-04 00:03:00 | 2013-06-04 03:00:00
web2 | running | 2013-06-04 03:00:00 | 2013-06-04 05:00:00
web1 | maintenance | 2013-06-04 02:00:00 | 2013-06-04 05:00:00
web1 | running | 2013-06-04 05:00:00 | 2013-06-04 07:00:00
我希望我的桌子最终看起来像这样(按 start_time 排序):
server | status | start_time | end_time
---------+------------+---------------------+---------------------
web1 | running | 2013-06-04 00:00:00 | 2013-06-04 02:00:00
web2 | down | 2013-06-04 00:01:00 | 2013-06-04 03:00:00
msdb | idle | 2013-06-04 00:02:00 | 2013-06-04 02:00:00
web1 | maintenance | 2013-06-04 02:00:00 | 2013-06-04 05:00:00
web2 | running | 2013-06-04 03:00:00 | 2013-06-04 05:00:00
web1 | running | 2013-06-04 05:00:00 | 2013-06-05 07:00:00
这让我知道我的盒子何时改变状态,然后当我对这些表运行一些报告时,我可以在 SQL 中查询 start_time 和 end_time。
任何线索如何做到这一点?我假设我需要一个更新语句,然后是一个删除。如果需要,我可以添加行号,尽管它们目前不存在。这可能是必要的,所以我们可以排序,然后检查 X 行的服务器和状态是否与 X + 1 行相同。
运行 postgres 8.1(我知道,我知道。很快就会到 8.4)。
【问题讨论】:
-
检查我添加的样本数据行,确保输入和输出都正确。样本数据需要一个不连续的后行,该行与前一行具有相同的状态。
-
是的。看起来不错。我一定错过了什么。
标签: sql postgresql timestamp delete-row timespan