3

単一成行注文に関する情報を含む 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なしでこれを達成する方法はありますか?

編集:問題を明確にするためだけに。次の marketorders があるとします (重要でないものはすべて除外し、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
4

2 に答える 2