基于时间的SQL聚合

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

我正在尝试计算人们在某个区域花费了多少时间。为此,我们有代表一个人的节点地址、区域名称和看到该人的时间。

原始数据

日期 地区名称 节点地址/人
8:15 区域1 1
8:20 区域1 1
8:25 区域1 1
8:30 区域1 1
8:45 区域1 1
9:00 区域1 1
8:15 区域2 2
8:20 区域2 2
9:00 区域2 1
9:05 区域2 2
9:10 区域2 2

预期数据

areaName | time
area1    | 25 min
area2    | 15 min

此时间的合理性取决于以下条件:

人 1 在 8:15 到 8:30 - 15 分钟内出现在区域 1 内(因为出现的时间间隔小于 10 分钟),也在 8:45 - 5 分钟内出现过(被认为是 5 分钟,因为只被看到一次,距离不到 10 分钟没有其他记录),9:00 - 5 分钟。

第二个人也是如此,从 8:15 到 8:20 - 5 分钟在区域 2 内,并在 9:00 到 9:100 - 10 分钟内被看到。

我能够开发一个查询来获取前一次和下一次的时间差异,我还进行验证以检查它是否比较同一个人:

SELECT
        date,
        node_address,
        areaName,
        CASE
            WHEN node_address = LAG(node_address) OVER (ORDER BY areaName, node_address, date)
            THEN DATETIME_DIFF(date, LAG(date) OVER (ORDER BY areaName, node_address, date), MINUTE)
            ELSE NULL
        END AS PrevDiff,
        CASE
            WHEN node_address = LEAD(node_address) OVER (ORDER BY areaName, node_address, date)
            THEN DATETIME_DIFF(LEAD(date) OVER (ORDER BY areaName, node_address, date), date, MINUTE)
            ELSE NULL
        END AS NextDiff
    FROM . . .

(但我无法找到进行此计算的解决方案)

sql mysql database google-bigquery
1个回答
0
投票
WITH 
cte1 AS (
  SELECT *, 
         (ROW_NUMBER() OVER (PARTITION BY `node_address/person` ORDER BY `date`) - 1) DIV 2 rn
  FROM test
  ),
cte2 AS (
  SELECT areaName, `node_address/person`,
         MIN(`date`) date_in, MAX(`date`) date_out
  FROM cte1
  GROUP BY areaName, `node_address/person`, rn
  )
SELECT areaName, SEC_TO_TIME(SUM(TIME_TO_SEC(date_out) - TIME_TO_SEC(date_in))) total
FROM cte2
GROUP BY areaName;
地区名称 总计
区域1 00:25:00
区域2 00:10:00

详细小提琴

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