Rom*_*ich 5 python django django-orm
回答这个问题,我发现不允许窗口函数与filter结合使用(从技术上讲,它们是允许的,但是filter子句会影响窗口)。有一个将窗口函数包装在内部查询中的提示,因此最终的SQL如下所示(据我了解):
SELECT * FROM (
SELECT *, *window_function* FROM TABLE)
WHERE *filtering_conditions*
Run Code Online (Sandbox Code Playgroud)
问题是:如何使用Django ORM编写此查询?
另一个解决方案是 Common Table Expressions (CTE),在django-cte的帮助下,你可以实现你想要的:
cte = With(
YouModel.objects.annotate(
your_window_function=Window(...),
)
)
qs = cte.queryset().with_cte(cte).filter(your_window_function='something')
Run Code Online (Sandbox Code Playgroud)
大致翻译为:
WITH cte as (
SELECT *, WINDOW(...) as your_window_function
FROM yourmodel
)
SELECT *
FROM cte
WHERE cte.your_window_function = 'something'
Run Code Online (Sandbox Code Playgroud)