gpt4 book ai didi

sql - Django ORM : Getting rows based on max value of a column

转载 作者:行者123 更新时间:2023-12-02 02:36:24 26 4
gpt4 key购买 nike

我有一个 Marketorders 类,它包含有关单个市场订单的信息,它们收集在市场快照中(由类 Snapshot 表示)。每个订单可以出现在多个快照中,当然最新的一行是相关的。

class Marketorders(models.Model):
id = models.AutoField(primary_key=True)
snapid = models.IntegerField()
orderid = models.IntegerField()
reportedtime = models.DateTimeField(null=True, blank=True)
...


class Snapshot(models.Model):
id = models.IntegerField(primary_key=True)
...

我正在做的是获取多个快照中的所有订单进行处理,但我只想包含每个订单的最新行。在 SQL 中,我会简单地做:
SELECT m1.* FROM marketorders m1 WHERE reportedtime = (SELECT max(reportedtime)  
FROM marketorders m2 WHERE m2.orderid=m1.orderid);

或者更好的是加入:
SELECT m1.* FROM marketorders m1 LEFT JOIN marketorders m2 ON 
m1.orderid=m2.orderid AND m1.reportedtime < m2.reportedtime
WHERE m2.orderid IS NULL;

但是,我就是不知道如何用 Django ORM 做到这一点。有没有办法在没有原始 SQL 的情况下实现这一点?

编辑:只是为了澄清问题。假设我们有以下市价单(忽略所有不重要的内容,仅使用 orderid、reportedtime):
1, 09:00:00
1, 10:00:00
1, 12:00:00
2, 09:00:00
2, 10:00:00

如何使用 ORM 获得以下设置?
1, 12:00:00
2, 10:00:00

最佳答案

如果我理解正确,您需要一个 Marketorder 对象列表,其中包含每个 Marketorder 和每个 orderid 的最高报告时间

这样的事情应该可以工作(免责声明:没有直接测试):

m_orders = Marketorders.objects.filter(id__in=(
Marketorders.objects
.values('orderid')
.annotate(Max('reportedtime'))
.values_list('id', flat=True)
))

对于文件检查:

http://docs.djangoproject.com/en/dev/topics/db/aggregation/

编辑:
这应该得到一个具有最高报告时间的特定订单 ID 的市场订单
order = (
Marketorders.objects
.filter(orderid=the_orderid)
.filter(reportedtime=(
Marketorders.objects
.filter(orderid=the_orderid)
.aggregate(Max('reportedtime'))
['reportedtime__max']
))
)

关于sql - Django ORM : Getting rows based on max value of a column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426904/

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