Применение агрегатной функции к результирующему набору результатов в памяти на основе каждой строки в нем - PullRequest
0 голосов
/ 28 сентября 2011

Мне нужно сформировать набор результатов в два этапа. Первый шаг прост и генерирует базовый набор результатов в памяти (назовем его B). На втором шаге мне нужно добавить дополнительный столбец к B (назовем его c). Для каждой строки в B, c может быть вычислено с помощью агрегатной функции на B на основе значений этой строки (хотя это выглядит неэффективно).

Окончательный набор результатов - B + c. Результаты должны быть отсортированы по столбцу из B, а также по столбцу c, поэтому все это должен быть один запрос.

Получение B просто, но как мне обработать его дальше, основываясь на его содержимом?

EDIT. Вот аналогия с таблицей, чтобы проиллюстрировать, что я подразумеваю под «применением агрегатной функции к B на основе каждой строки в B»:

Скажем, у нас есть таблица T с колонкой col. Предположим, что для каждой строки в T мы хотим вычислить количество строк, которые имеют большее значение col. Вы можете сделать это так:

select
  t1.*, 
  (select sum(case when t2.col > t1.col then 1 else 0 end) from T t2) as count
from T t1

В моем случае проблема в том, что B - это не реальная таблица, а набор результатов в памяти. Как я могу обработать его подобным образом?

1 Ответ

0 голосов
/ 28 сентября 2011

ОК - я сделаю еще один шаг.

Псевдоним как набора результатов в памяти, так и столбцов, которые необходимо использовать в этом наборе результатов для получения c, должен работать.

Чтобы продолжить ваш пример сверху:

select B.col,
(select sum(case when B2.col > B.col then 1 else 0 end) from (select whatever_col as col
from whatever_table) B2) as c
from
(select whatever_col as col from whatever_table) as B;

Дайте мне знать, если у меня снова неправильный конец палки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...