在我的SQLite表中,我具有以下字段(timestamp
,zone_id
,object_count
和object_ids
),这些是在区域中排队的人的数据。每当有人加入队列时,他就会被传感器捕获并被分配为object_id
。 timestamp
是每秒从传感器服务器发送到数据库的数据。
我需要找到队列中每个object_ids
的持续时间,以便使用Flask框架在我的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']
如何查询和解决这个问题?
答案 0 :(得分:0)
假设表的名称为queues
,定义了object_id
的表为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'']');
通过使用窗口函数MIN()
和MAX()
和函数strftime()
,可以通过连接两个表的SQLite查询获得所需的结果:
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
请参见demo。
结果:
> object_id | diff
> :-------- | ---:
> 2140 | 10
> 2143 | 10
> 2166 | 4
答案 1 :(得分:-1)
因此,在application.py中,您应该具有以下代码才能获取正确的数据库,该代码应该位于文件中的某个位置,以便您所有的函数都可以访问它。
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
然后在需要时间的函数中的某个地方,应该有类似的内容
timestamp = db.execute(text("SELECT timestamp FROM NAME_OF_YOUR_TABLE").fetchall()#this will get you all of the timestamps
现在您在python中的表中有了时间戳,因此您可以轻松地执行任何操作,可以轻松地将其转换为datetime格式,然后仅使用datetime.datetime.now()函数并将其减去彼此之间,如果您还有其他需要,请随时在下方留言。
编辑:因此,为了遍历ID列,您将需要以下内容:
T1 = db.execute(text("SELECT object_ids FROM NAME_OF_YOUR_TABLE")).fetchall()
for i in T1:
timestamp = db.execute(text("SELECT timestamps FROM NAME_OF_YOUR_TABLE WHERE object_ids=:object_ids"), {'object_ids':i}).fetchone()
print('Timestamp = ' + timestamp 'and id = ' + i)