Django ORM:具有后续过滤功能的窗口函数

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编写此查询?

Seb*_*bin 7

另一个解决方案是 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)