【问题标题】:msSQL log data - start and end from multiple timestampsmsSQL 日志数据 - 从多个时间戳开始和结束
【发布时间】:2013-06-14 22:24:26
【问题描述】:

我有一个表,其中包含来自生成的日志文件的许多不同行。每行都有一个时间戳(以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 值需要与处理过的数据一起记录

【问题讨论】:

    标签: sql sql-server date timestamp


    【解决方案1】:

    您使用的是 SQL Server 2012。是的。

    这就是想法。查找源的每个序列的开始位置。这可以是第一次看到源,也可以是在 5 分钟内没有看到源时。您可以使用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
    

    【讨论】:

    • 像梦一样工作!谢谢你,我不知道 lag() 函数,确实很方便!
    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多