【发布时间】:2021-07-15 17:09:00
【问题描述】:
我有一个内置在 Django 中的系统来接收数据。我存储数据如下:
id | sensor | message_id | value
----+--------+------------+-------
1 | A | 1 | xxx
2 | A | 2 | xxx
3 | A | 3 | xxx
4 | B | 1 | xxx
5 | B | 2 | xxx
6 | B | 4 | xxx
7 | B | 7 | xxx
我们预计message_id 会随着每条后续消息而增加每个传感器。如您所见,传感器 B 的 message_id 为:1、2、4、7。这意味着传感器 B 缺少编号为 3、5 和 6 的消息。在这种情况下,我们需要调查丢失的消息,尤其是如果有很多失踪。所以我现在想要一种方法来了解这些丢失的消息何时发生。
所以我想检查过去五分钟内是否丢失了一条消息。我希望输出类似于:
在过去 5 分钟内传感器 B 缺少 3 条消息。缺少以下 id:3、5、6
我想到的最简单的方法是查询一个传感器的 message_id,然后遍历它们以检查是否跳过了任何数字。我想到了这样的事情:
five_minutes_ago = datetime.now() - timedelta(minutes=5)
queryset = MessageData.objects.filter(created__gt=five_minutes_ago).filter(sensor='B').order_by('message_id')
last_message_id = None
for md in queryset:
if last_message_id is None:
last_message_id = md.message_id
else:
if md.message_id != last_message_id + 1:
missing_messages = md.message_id - last_message_id - 1
print(f"{missing_messages} messages missing for sensor {md.sensor}")
但由于我有数百个传感器,这似乎不是最好的方法。甚至可以在 SQL 本身中执行此操作,但我不知道有什么方法可以这样做。
谁能告诉我如何有效地做到这一点?
【问题讨论】:
-
出现这种情况是什么意思?
-
@Strawberry - 这意味着在此过程中某处丢失了一条消息。
-
想要的结果应该是什么样子?请相应地编辑您的问题。
-
另外,如果它是丢失的第一条消息怎么办?还是最后一个!?!
-
@Strawberry - 我编辑了问题以解释传感器 B 缺少 3 号。如果 5 分钟内的第一条消息丢失,那就太可惜了。我可能会每 5 分钟检查最后 10 分钟以解决此问题。现在的主要问题是如何更有效地检查所有传感器。
标签: python sql django postgresql