Moh*_*han 7 django postgresql django-models django-orm django-rest-framework
我想使用 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;
Run Code Online (Sandbox Code Playgroud)
我当前的 ORm 查询
EmpSalary.objects.values('depname', 'empno', 'salary', 'enroll_date').annotate(
pos= Window(
expression=RowNumber(),
partition_by=[F('depname')],
order_by=F('salary').desc(),
)
)
Run Code Online (Sandbox Code Playgroud)
上面的ORM查询集大致翻译为内部查询
SELECT depname, empno, salary, enroll_date,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) AS pos
FROM empsalary
Run Code Online (Sandbox Code Playgroud)
我想知道如何在外部查询的 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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |