我有一个表,其中包含许多来自生成的日志文件的不同行。每行都有一个时间戳(以epoch格式)下面是一个数据样本,目前大约有150万行数据!
EpochTime Date Dbm Source
1370732265.373915000 2013-06-17 11:36:39.477 -85 1
1370732265.376506000 2013-06-17 11:36:39.487 -76 2
1370732265.398012000 2013-06-17 11:37:39.503 -81 1
1370732265.463492000 2013-06-17 11:37:39.520 -94 3
1370732265.692144000 2013-06-17 11:37:39.533 -77 2
1370732265.845195000 2013-06-17 11:38:39.550 -84 4
1370732265.933283000 2013-06-17 11:38:39.580 -84 4
1370732265.935863000 2013-06-17 11:38:39.597 -84 5
1370732265.939143000 2013-06-17 11:39:39.597 -84 2
1370732265.939858000 2013-06-17 11:39:39.613 -84 4
1370732265.965481000 2013-06-17 11:40:39.627 -82 5
1370732266.049712000 2013-06-17 11:40:39.677 -82 3
1370732266.110457000 2013-06-17 11:41:39.690 -84 4
1370732266.110457000 2013-06-17 11:41:39.690 -84 6
1370732266.110457000 2013-06-17 11:42:39.690 -84 3
1370732266.110457000 2013-06-17 11:42:39.690 -84 4
1370732266.110457000 2013-06-17 11:42:39.690 -84 6
1370732266.110457000 2013-06-17 11:43:39.690 -84 2
1370732266.110457000 2013-06-17 11:44:39.690 -84 1
我需要做的是找到每个来源的开始和结束时间,但是在再次计算来源之前最多只能有5分钟的时间。即,源1将被记录两次,所有其他源仍将继续记录,直到源没有被看到5分钟,进入如下所示的表。
ID Duration Store Start End MacID Dbm
7 31 1 2013-06-08 07:46:10.000 2013-06-08 08:17:00.000 1 -84
4 2 1 2013-06-08 18:42:53.000 2013-06-08 18:44:06.000 2 -83
2 1 1 2013-06-08 14:31:20.000 2013-06-08 14:32:08.000 3 -89
11 213 1 2013-06-08 12:43:55.000 2013-06-08 16:16:11.000 4 -86
6 585 1 2013-06-08 14:03:58.000 2013-06-08 23:48:44.000 5 -75
28 287 1 2013-06-08 07:15:40.000 2013-06-08 12:02:10.000 6 -88
28 287 1 2013-06-08 07:15:40.000 2013-06-08 12:02:10.000 1 -81
最好是我正在寻找完整的SQL解决方案,因为存在大量数据,因为循环通过这么多数据。我已经开始了,但到目前为止我所做的一切只计算每个时期的来源一次(目前设定为一天的数据)
数据库在sql server 2012上运行
编辑:未提及的一件事是每个“访问”的最高DBM值需要使用已处理的数据记录
答案 0 :(得分:1)
您正在使用SQL Server 2012.是的。
这是个主意。查找源的每个序列的开始位置。这是第一次看到源,或者在五分钟内没有看到源。您可以使用lag()
处理此问题。
接下来,执行NewStart
标志的累积总和。序列中的所有内容都具有相同的值,因此可以用于分组。
最终结果来自聚合。输出中的所有字段都不清楚,但这里有SQL来完成大部分工作:
select count(*) as numIds, max(date) - MIN(date) as duration, 1 as store,
MIN(date) as start, MAX(date) as end, source as MacId
from (select t.*,
SUM(NewStart) over (partition by source order by date) as Grp
from (select t.*,
(case when date - lag(date) over (partition by source order by date) < 5/(60*24.0) then 0
else 1
end) as NewStart
from t
) t
) t
group by grp