После комментария и его обдумывания, я думаю, следующий запрос делает то, что вы хотите.
Я выбираю первые 100 «окон», полученных в результате запроса, и возвращаю все строки, попадающие в эти окна. Поскольку окна разделены на field1
, это фактически 100 различных значений field1
с наибольшим sum2
. Для связей на sum2
больше field1
выигрывает в моем запросе (вы не указали).
WITH x AS (
SELECT field1
,field2
,field3
,sum(field2) over w sum2
,sum(field3) over w sum3
FROM table1
GROUP BY field1, field2, field3
WINDOW w AS (PARTITION BY field1)
)
, y AS (
SELECT field1
FROM x
GROUP BY sum2, field1
ORDER BY sum2 DESC, field1 DESC
LIMIT 100
)
SELECT x.*
FROM y
JOIN x USING (field1)
ORDER BY sum2 DESC, field1 DESC, field2 DESC, field3 DESC;
Важнейшим моментом является генерация агрегированных значений в CTE, выбор из 100 выигрышных окон из других в CTE (это также можно сделать с помощью DISTINCT, я выбрал GROUP BY
/ ORDER BY
) и присоединение к вернитесь к первому CTE, чтобы получить все строки для этих окон.
В целом это довольно сложный запрос.