我如何按时间对行进行分组,除非存在明显的差距?

问题描述 投票:0回答:1

问题域:我(这是企业)有一个可以接受公共连接的wifi网络。我们想知道每个设备与每个访问点(AP)保持连接的时间。这就是所谓的“停留时间”。问题很复杂,因为设备白天通常可以在AP之间移动,并且经常会多次返回其中许多AP。

[我们目前使用Splunk作为我们的数据捕获和报告工具,它可以自动完成,但是我们正在考虑迁移到AWS,因此需要使用ETL和SQL的组合来重新构建所有内容。

我有如下数据:

rowID clientMAC apMAC timeSeen
 100      1       a   12:01
 101      1       a   12:03
 102      1       a   12:05
 103      1       b   12:10
 104      1       b   12:20
 105      2       a   12:20
 106      2       a   12:22
 107      1       a   13:00
 108      1       a   13:02
 109      1       a   13:06
 110      1       a   13:12

[我的挑战是报告每个clientAP + macAP示例的持续时间,例如,clientMAC=1连接到apMAC=a多长时间。

由于timeSeen连接到中间的timeSeen,因此我无法从初始clientMAC=1中获得最后的apMAC=b,因此结果也将包括该连接的时间。

我需要做的简单的英语逻辑是:

对于clientMACapMAC的每个分组,请确定所选时间段内的连接持续时间。如果在相同组合的行之间存在15分钟的间隔,请开始新的工期计算并关闭旧的工期。本质上,在给定clientMAC处看到的给定apMAC的每组应该是单独的“交易”,并以单行形式报告。

所以所需的输出类似于:

clientMAC apMAC Duration
    1      a      ...
    1      b      ...
    2      a      ...
    1      a      ...
sql group-by splunk splunk-query
1个回答
0
投票

您可以使用lag()和累积和分配组。因为您提到了AWS,所以我将使用与该数据库兼容的语法:

select clientmac, apmac, min(timeseen), max(timeseen)
from (select t.*,
             sum( case when prev_timeseen > timeseen - interval '15 minute'
                       then 0 else 1
                  end) over (partition by clientmac, apmac order by timeseen) as grouping
      from (select t.*,
                   lag(timeseen) over (partition by clientmac, apmac order by timeseen) as prev_timeseen
            from t
           ) t
     ) t
group by clientmac, apmac, grouping
order by min(timeseen);

实际计算时间差取决于数据类型。您可能只需要减去MIN()MAX()值即可。

© www.soinside.com 2019 - 2024. All rights reserved.