回答 这个问题, I 发现 窗口函数不允许与过滤器结合(技术上是允许的,但过滤器子句会影响窗口)。有一个提示,就是要把window函数包在一个内部查询中,所以最后的SQL是这样的(据我了解)。
SELECT * FROM (
SELECT *, *window_function* FROM TABLE)
WHERE *filtering_conditions*
问题是:如何用Django ORM写这个查询?
解决方案:
另一种解决方案是通用表表达式(CTE),借助于 django-cte,你可以实现你想要的东西。
cte = With(
YouModel.objects.annotate(
your_window_function=Window(...),
)
)
qs = cte.queryset().with_cte(cte).filter(your_window_function='something')
大致意思是:
WITH cte as (
SELECT *, WINDOW(...) as your_window_function
FROM yourmodel
)
SELECT *
FROM cte
WHERE cte.your_window_function = 'something'