python - 使用时间戳计算总持续时间
问题描述
在我的 SQLite 表中,我有以下字段(timestamp
、和) zone_id
,这些是人们在区域中排队的数据。每当有人加入队列时,他就会被传感器捕获并分配一个. 是每秒从传感器服务器发送到数据库的数据。object_count
object_ids
object_id
timestamp
我需要找到object_ids
队列中每个的持续时间,以使用烧瓶框架计算和显示我的 Web 应用程序中的等待时间。例如,object_ids
(2166) 在 时进入队列,在 时2020-10-19 17:03:46.000000
离开2020-10-19 17:03:50.000000
,他的排队时间为 5 秒。简单的逻辑是从最后一个object_id
出现的时间戳中减去第一个出现时的时间戳object_id
。
# timestamp zone_id object_count object_ids #
2020-10-19 17:03:43.000000 10 2 ['2140', '2143']
2020-10-19 17:03:44.000000 10 2 ['2140', '2143']
2020-10-19 17:03:45.000000 10 2 ['2140', '2143']
2020-10-19 17:03:46.000000 10 3 ['2140', '2143', '2166']
2020-10-19 17:03:47.000000 10 3 ['2140', '2143', '2166']
2020-10-19 17:03:49.000000 10 3 ['2140', '2143', '2166']
2020-10-19 17:03:50.000000 10 3 ['2140', '2143', '2166']
2020-10-19 17:03:51.000000 10 2 ['2140', '2143']
2020-10-19 17:03:53.000000 10 2 ['2140', '2143']
我该如何查询和解决这个问题?
解决方案
假设您的表的名称是queues
并且object_id
定义了 s 的表是objects
(将名称更改为实际名称),所以您有这样的东西:
CREATE table objects (`object_id` TEXT);
INSERT INTO objects (`object_id`) VALUES
('2140'), ('2143'), ('2166');
CREATE TABLE queues (`timestamp` TEXT, `zone_id` INTEGER, `object_count` INTEGER, `object_ids` VARCHAR(24));
INSERT INTO queues (`timestamp`, `zone_id`, `object_count`, `object_ids`) VALUES
('2020-10-19 17:03:43.000000', '10', '2', '[''2140'', ''2143'']'),
('2020-10-19 17:03:44.000000', '10', '2', '[''2140'', ''2143'']'),
('2020-10-19 17:03:45.000000', '10', '2', '[''2140'', ''2143'']'),
('2020-10-19 17:03:46.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
('2020-10-19 17:03:47.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
('2020-10-19 17:03:49.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
('2020-10-19 17:03:50.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
('2020-10-19 17:03:51.000000', '10', '2', '[''2140'', ''2143'']'),
('2020-10-19 17:03:53.000000', '10', '2', '[''2140'', ''2143'']');
您可以使用连接两个表的 SQLite 查询获得所需的结果,方法是使用窗口函数MIN()
和MAX()
和函数strftime()
:
SELECT DISTINCT o.object_id,
strftime('%s', MAX(q.timestamp) OVER (PARTITION BY o.object_id)) -
strftime('%s', MIN(q.timestamp) OVER (PARTITION BY o.object_id)) diff
FROM objects o INNER JOIN queues q
ON ',' || REPLACE(REPLACE(REPLACE(REPLACE(q.object_ids, '''', ''), '[', ''), ']', ''), ' ', '') || ','
LIKE '%,' || o.object_id || ',%'
如果您的 SQLite 版本不支持窗口函数,请使用GROUP BY
:
SELECT o.object_id,
strftime('%s', MAX(q.timestamp)) - strftime('%s', MIN(q.timestamp)) diff
FROM objects o INNER JOIN queues q
ON ',' || REPLACE(REPLACE(REPLACE(REPLACE(q.object_ids, '''', ''), '[', ''), ']', ''), ' ', '') || ','
LIKE '%,' || o.object_id || ',%'
GROUP BY o.object_id
请参阅演示。
结果:
> object_id | diff
> :-------- | ---:
> 2140 | 10
> 2143 | 10
> 2166 | 4
推荐阅读
- javascript - SyntaxError:_callee3$ 处的 JSON 输入意外结束
- css - 如何在数独表中放置一条垂直线
- powerbi - 使前几行对切片器 Power BI 无响应
- javascript - 如何将新变量添加到 javascript 中的现有设置组
- sql-server - SQL Server:在远程服务器中使用同义词查询
- plotly - 将 2D Plotly Scattergeo 转换为 3D 正交
- python - 通过 VBS + python 覆盖 excel 文件
- keycloak - 与 keycloak REST Api 的精确参数搜索匹配
- google-sheets - 在 Google 表格中,如何通过 ArrayFormula() 计算行中特定单词的出现次数
- javascript - 从 javascript 数组中删除所有虚假值,包括 NaN 但不包括 0 和空字符串