我正在尝试计算人们在某个区域花费了多少时间。为此,我们有代表一个人的节点地址、区域名称和看到该人的时间。
原始数据
日期 | 地区名称 | 节点地址/人 |
---|---|---|
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 . . .
(但我无法找到进行此计算的解决方案)
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 |