gpt4 book ai didi

python - 从 Django QuerySet 中删除一些 "duplicates"

转载 作者:行者123 更新时间:2023-11-29 12:10:50 24 4
gpt4 key购买 nike

我有一个包含多个模型结果的 Django QuerySet:

class MyModel(models.Model):
value = models.FloatField()
date_seen = models.DateTimeField()

现在 QuerySet 随着时间的推移受到限制并且包含重复的结果:

MyModel.date_seen   - MyModel.value
2016-03-01 10:00:00 - 124
2016-03-01 11:00:00 - 124
2016-03-01 12:00:00 - 99
2016-03-01 13:00:00 - 99
2016-03-01 14:00:00 - 99
2016-03-01 15:00:00 - 103
2016-03-01 16:00:00 - 103
2016-03-01 17:00:00 - 176
2016-03-01 18:00:00 - 12
2016-03-01 19:00:00 - 12

现在我想要的是一个只包含值已更改的结果的 QuerySet,因此结果如下:

MyModel.date_seen   - MyModel.value
2016-03-01 10:00:00 - 124
2016-03-01 12:00:00 - 99
2016-03-01 15:00:00 - 103
2016-03-01 17:00:00 - 176
2016-03-01 18:00:00 - 12

该列表只是一个示例,结果计数要高得多(大约 1000 个结果),所以我需要一个高性能的解决方案 ;-) 这甚至可能吗?有什么建议么?非常感谢!

顺便说一句。我在下面使用 postgresql 作为数据库。

最佳答案

我找到了一个仅适用于 POSTGRESQL 的单查询解决方案,基于 this beautiful post ,他们解释了如何使用 postgres lead可用于评估当前行之前任意行的值的函数。只需确保在下面的查询中将 clubs_mymodel 替换为 [yourappname]_mymodel,您就可以开始了!

输出:

for m in MyModel.objects.all():
print m

2016-03-21 10:00:00+00:00 - 124.0
2016-03-21 11:00:00+00:00 - 124.0
2016-03-21 12:00:00+00:00 - 99.0
2016-03-21 13:00:00+00:00 - 99.0
2016-03-21 14:00:00+00:00 - 99.0
2016-03-21 16:00:00+00:00 - 103.0
2016-03-21 15:00:00+00:00 - 103.0
2016-03-21 17:00:00+00:00 - 176.0
2016-03-21 18:00:00+00:00 - 12.0
2016-03-21 19:00:00+00:00 - 12.0
2016-03-21 20:00:00+00:00 - 90.0
2016-03-21 21:00:00+00:00 - 12.0

q = MyModel.objects.raw('SELECT m1.id, m1.value, m1.date_seen \
FROM (SELECT m2.id, m2.value, m2.date_seen, lead(m2.value) \
OVER (ORDER BY m2.date_seen DESC) as prev_value \
FROM clubs_mymodel m2 ORDER BY m2.date_seen) as m1 \
WHERE m1.value IS DISTINCT FROM m1.prev_value \
ORDER BY m1.date_seen ASC')

for m in q:
print m

2016-03-21 10:00:00+00:00 - 124.0
2016-03-21 12:00:00+00:00 - 99.0
2016-03-21 15:00:00+00:00 - 103.0
2016-03-21 17:00:00+00:00 - 176.0
2016-03-21 18:00:00+00:00 - 12.0
2016-03-21 20:00:00+00:00 - 90.0
2016-03-21 21:00:00+00:00 - 12.0

关于python - 从 Django QuerySet 中删除一些 "duplicates",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36136063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com