从Django查询中删除一些“重复项”

2024-09-28 22:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django QuerySet,其中包含一个模型的几个结果:

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

现在,查询集会随着时间的推移而受到限制,并且包含重复的结果:

^{pr2}$

现在我想要的是一个只包含值发生变化的结果的查询集,因此结果如下:

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作为数据库。在


Tags: django模型datemodelvaluemodels时间class
1条回答
网友
1楼 · 发布于 2024-09-28 22:15:47

我发现了一个只在POSTGRESQL上运行的基于this beautiful post的单查询解决方案,其中他们解释了如何使用postgres ^{}函数,该函数可用于计算当前行之前任意行的值。只要确保在下面的查询中将clubs_mymodel替换为[yourappname]\u 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

相关问题 更多 >