'Django: Is there a way to apply an aggregate function on a window function?

I have already made a raw SQL of this query as a last resort.

I have a gaps-and-islands problem, where I get the respective groups with two ROW_NUMBER -s. Later on I use a COUNT and a MAX like so:

SELECT id, name, MAX(count)
FROM (
    SELECT id, name, COUNT(*)
    FROM (
        SELECT players.id, players.name,
        (ROW_NUMBER() OVER(ORDER BY match_details.id, goals.time) -
        ROW_NUMBER() OVER(PARTITION BY match_details.id, players.id ORDER BY match_details.id, goals.time)) AS grp
        FROM match_details
        JOIN players
        ON players.id = match_details.player_id
        JOIN goals
        ON goals.match_detail_id = match_details.id
        ORDER BY match_details.id, goals.time
    ) AS x
    GROUP BY grp, id, name
    ORDER BY count DESC
) AS y
GROUP BY id, name
ORDER BY MAX(count) DESC, name

players example:

id  | name
----+-------
1   | John
2   | Mark

match_details example:

id  | player_id    
----+------------
1   | 1          
2   | 1          
3   | 2          
4   | 2          

goals example:

id  | match_detail_id  | time    
----+------------------+---------
1   | 1                | 2
2   | 1                | 10
3   | 2                | 2
4   | 3                | 1
5   | 3                | 5
6   | 4                | 6

output example:

id  | name   | max
----+--------+---------
1   | John   | 2
2   | Mark   | 2

So far, I have finished the innermost query with Django ORM, but when I try to annotate over group , it throws an error:

django.db.utils.ProgrammingError: aggregate function calls cannot contain window function calls

I haven't yet wrapped my head around using Subquery, but I'm also not sure if that would work at all. I do not need to filter over the window function, only use aggregates on it.

Is there a way to solve this with plain Django, or do I have to resort to hybrid raw-ORM queries, perhaps to django-cte ?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source