Использование агрегата и оконной функции в подзапросе - PullRequest
0 голосов
/ 13 мая 2019

У меня есть ситуация, когда у меня есть запрос с подзапросом, который использует SUM() OVER.Хотя подзапрос работает нормально сам по себе, при использовании в контексте внешнего запроса агрегирование не применяется.

Я сделал этот тестовый пример, чтобы приблизиться к тому, что я пытаюсь сделать:

CREATE TEMPORARY TABLE TestNumbers
  (id INTEGER PRIMARY KEY, number INTEGER);
INSERT INTO TestNumbers (number)
  VALUES (10), (15), (20), (25), (30);

SELECT SUM(number) OVER (ORDER BY id) FROM TestNumbers;

Возвращает ожидаемый результат ... скользящую сумму всех значений.10, 25, 45, 70, 100.

Однако, если я использую это как подзапрос ...

SELECT (
  SELECT SUM(number) OVER (ORDER BY id)
) FROM TestNumbers;

Iполучить результат при не примененной агрегации.10, 15, 20, 25, 30.

Как использовать это агрегирование с OVER в подзапросе?

1 Ответ

1 голос
/ 13 мая 2019

Я удивлен, что это даже работает:

SELECT (SELECT SUM(number) OVER (ORDER BY id))
FROM TestNumbers;

Я имею в виду, это так. По сути, подзапрос является коррелированным подзапросом, поэтому он выполняется для каждой строки во внешнем запросе. То есть для каждого прогона существует только одно значение - коррелированное значение из внешнего запроса. Это просто собирается вернуть номер.

Не ясно, что вы действительно хотите сделать.

Когда я впервые прочитал запрос, я подумал, что это было:

SELECT *
FROM (SELECT SUM(number) OVER (ORDER BY id))
      FROM TestNumbers
     ) tn

Это нормально и работает с накопленным значением.

Перемещение FROM в подзапрос:

SELECT (SELECT SUM(number) OVER (ORDER BY id))
        FROM TestNumbers
       )

Разбивает запрос, поскольку подзапрос возвращает более одной строки.

...