我想使用 django orm 编写此查询
SELECT depname, empno, salary, enroll_date
FROM
(SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
FROM empsalary
) AS ss
WHERE pos < 3;
我当前的 ORm 查询
EmpSalary.objects.values('depname', 'empno', 'salary', 'enroll_date').annotate(
pos= Window(
expression=RowNumber(),
partition_by=[F('depname')],
order_by=F('salary').desc(),
)
)
上面的 ORM 查询集粗略地转化为内部查询
SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
FROM empsalary
我想知道如何在外部查询的 FROM 子句中获取整个内部查询。
最佳答案
事实上,不可能使用 Window
在 WHERE
内查询条款。因此,请改用 Subquery
:
from django.db.models import OuterRef, Subquery
top_salaries = EmpSalary.objects.filter(
depname=OuterRef('depname')
).order_by('-salary')[:3]
result = EmpSalary.objects.filter(
pk__in=Subquery(top_salaries.values('pk'))
).values('depname', 'empno', 'salary', 'enroll_date')
关于django - 如何在 Django ORM 中的 From 子句中编写子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60864345/