Мне нужно использовать оконную функцию, например NTILE, но кажется, что NTILE нельзя использовать после GROUP BY. Он может создавать сегменты, но тогда как я могу использовать эти сегменты для агрегации?
Сначала вы используете NTILE
для присвоения номеров сегментов в подзапросе, а затем группируете по нему во внешнем запросе.
Использование подзапроса
SELECT bucket
, AVG(value) AS avg_value
FROM ( SELECT value
, NTILE(3) OVER ( ORDER BY date ) AS bucket
FROM test
) x
GROUP BY bucket
ORDER BY bucket
Использование предложения WITH
WITH x AS (
SELECT date
, value
, NTILE(3) OVER ( ORDER BY date ) AS bucket
FROM test
)
SELECT bucket
, COUNT(*) AS bucket_size
, MIN(date) AS from_date
, MAX(date) AS to_date
, MIN(value) AS min_value
, AVG(value) AS avg_value
, MAX(value) AS max_value
, SUM(value) AS sum_value
FROM x
GROUP BY bucket
ORDER BY bucket