【发布时间】:2018-11-14 07:03:32
【问题描述】:
我正在尝试使用 Django 的 ORM 进行此查询:
SELECT
id,
pn,
revision,
description
FROM (SELECT
id,
pn,
revision,
MAX(revision)
OVER (
PARTITION BY pn ) max_rev,
description
FROM table) maxarts
WHERE revision = max_rev
结果需要是一个查询集,我已经尝试了所有我知道的 Window/OuterRef/Subquery 组合,但没有成功。 我必须使用原始查询吗?
提前致谢 马可
编辑#1:
我会尝试更好地解释,我有一个看起来像这样的模型:
class Article(models.Model):
pn = models.CharField()
revision = models.CharField()
description = models.CharField()
class Meta:
unique_together = [("pn", "revision"), ]
数据是这样的:
pn1 rev1 description
pn1 rev2 description
pn2 rev1 anotherdescription
pn1 rev3 description
pn2 rev2 anotherdescription
我需要一个只包含 Max("revision") 值的查询集,每次用户对对象进行修改时,该值都会递增。 我希望现在更清楚了。谢谢!
编辑#2
按照建议,我正在写我已经尝试过的内容:
使用第一条消息中编写的查询的原始 SQL,仅选择 id 字段并将其作为 id__in=ids 传递给 ORM。慢得要命,无法使用。
声明了一个用作过滤器的窗口函数:
Article.objects.annotate(
max_rev=Window(expression=Max("revision"), partition_by=F("pn"))
).filter(revision=F("max_rev"))
但是 Django 抱怨我不能在 where 子句中使用窗口函数(这是正确的)。
然后我尝试将窗口用作子查询:
window_query = Article.objects.annotate(
max_rev=Window(expression=Max("revision"), partition_by=F("pn"))
)
result = Article.objects.filter(revision=Subquery(window_query))
我也尝试过使用 OuterRef,将 max_rev 注释用作连接,但没有运气。 我没有主意了!
【问题讨论】:
-
也许最好解释一下你到底想要什么。我知道这可能是 XY 问题。
标签: django orm window subquery max