【发布时间】:2017-01-17 23:00:48
【问题描述】:
我正在尝试收集有关数据的简单统计信息,例如服务在线时间、服务离线时间、平均值等。我已经找到了一些解决方案,但它们都依赖于某些东西,例如行背靠背 (ROW_NUMBER -1) 或只有两种状态。
我的数据以日志的形式出现,总是在事后(即没有实时数据)。我要弄清楚的最大问题是有两个以上的州。目前,可能有四种不同的状态(启用、禁用、活动、非活动),我希望能够收集每种状态的数据。
我一次只提供一行数据,其中包含服务名称、旧状态、新状态和时间戳。目前,数据存储在一个表中。我无法更改数据的提供方式,但我可以更改数据的存储方式,并且我开始认为该表是我的主要缺点。
下面是一个示例,说明当前数据如何最终出现在我的表中:
CREATE TABLE IF NOT EXISTS statusupdates (
sid int UNIQUE,
fullname VARCHAR(64),
oldstatus VARCHAR(16),
newstatus VARCHAR(16),
time TIMESTAMP);
INSERT INTO statusupdates VALUES
(null, 'fictHTTP', 'Off', 'On', '2017-01-01 02:20:00'),
(null, 'faked', 'On', 'Inactive', '2017-01-01 02:25:00'),
(null, 'ipsum', 'Inactive', 'On', '2017-01-01 02:30:00'),
(null, 'resultd', 'On', 'Inactive', '2017-01-01 02:35:00'),
(null, 'ipsum', 'On', 'Active', '2017-01-01 02:40:00'),
(null, 'fictHTTP', 'On', 'Active', '2017-01-01 02:45:00'),
(null, 'faked', 'Inactive', 'Off', '2017-01-01 02:50:00'),
(null, 'ipsum', 'Active', 'Off', '2017-01-01 02:55:00'),
(null, 'resultd', 'Inactive', 'Off', '2017-01-01 03:00:00');
我相信我发现的一种方法是将其缩小到一项,例如resultd。像SELECT fullname, newstatus, time FROM statusupdates WHERE fullname='resultd' ORDER BY time DESC; 这样的东西。然后使用该数据,使用相同的方法进行另一个查询,但向前迈出一步(因为它是降序)并从该记录中获取newstatus。当我输入时,它似乎很草率。
或者抓取oldstatus 并在第二个查询中使用它来查找以下记录的newstatus。但同样,这可能是草率的。
我知道还有一种方法可以将这两个理论查询结合起来。所以,总而言之,我远远超出了我的头脑,请原谅我!最后,我想查看每个状态的总时间、平均时间等统计数据。我现在最大的障碍是获取查询以提供结果,例如,ipsum 的每个时间戳条目,以便我可以从前一个条目中获取持续时间,并重复此操作,直到它完成所有记录。
或者,也许,我完全想多了,把所有数据都放在一个表中,让它变得太复杂了——到目前为止,我已经在这个项目中为不相关的项目做了两次。
额外的想法:一个实例,我可以做SELECT old_status, new_status, time FROM statusupdates WHERE time = '2017-01-01 03:00:00' 然后我可以像这样使用old_status,SELECT old_status, new_status, time FROM statusupdates WHERE time < 'timeStamp' AND new_status = 'oldStatus' 然后减去两个时间戳,这会给我一个例子的数据。但是,接下来如何做,然后下一步,直到它击中所有这些。
更新,另一个想法:结合您的一些很棒的建议,向后阅读日志怎么样? 没关系,到那时,它们被读取的方向无关紧要。当它遇到状态时,创建一个不完整的记录。它将包含 old_status 和 time_stamp 作为 end_time。然后当它再次遇到该服务时,它会检查 new_status = old_status 并使用 time_stamp 作为 start_time 更新记录。
这似乎会导致大量开销。必须检查每条记录以查看它是否存在,如果不存在,则更新一个。或者这还不算太糟糕?
【问题讨论】:
-
这听起来像是一个数据流。你看过 Streams 吗?
-
我觉得如果我这样做会更容易。但不是,静态文本文件在编写之后很长时间。
-
也许您可以汇总文件数据?
-
这基本上就是我想要做的。我最大的问题是如何首先构建它。一个实例,我可以做
SELECT old_status, new_status, time FROM statusupdates WHERE time = '2017-01-01 03:00:00'然后我可以像这样使用 old_status,SELECT old_status, new_status, time FROM statusupdates WHERE time < 'timeStamp' AND new_status = 'oldStatus'然后减去两个时间戳,这会给我一个例子的数据。但是,接下来如何做,下一步,直到它击中所有的人。 -
逐行搜索java流8文件。有几个例子可以帮助你
标签: java sql hsqldb usage-statistics