Я хотел бы вызвать агрегированную функцию (стоимость) один раз в столбце и каскадировать ее через собственные левые соединения (используемые для создания перестановки или комбинации строк). Таким образом, я считаю, что стоимость O (n) связана с вызовом ее после присоединения O (строка ^ присоединяется). Начиная с чего-то вроде этого:
id | cost
----------
1 | 5
2 | 10
Я хотел бы сделать что-то похожее ниже. Я могу сделать что-то подобное с выбором во временную таблицу и присоединиться к ней, но Я бы хотел избежать использования временной таблицы...
CREATE TEMP TABLE tmp_750309_plans AS (SELECT *, cost(id) as cost FROM plans WHERE plans.id IN (1,2,...));
SELECT * FROM tmp_750309_plans AS t1 LEFT JOIN tmp_750309_plans AS t2 ON ...
Я бы предпочел сделать что-то вроде:
SELECT id, cost(id) as cost FROM plans AS t1
LEFT JOIN t1 AS t2
ON t1.id != t2.id
AND ...
Чтобы получить что-то вроде этого:
id | cost | id | cost |
-----------------------
1 | 5 |NULL| NULL |
2 | 10 |3 | 15 |
Любая помощь будет принята с благодарностью.
Нет необходимости создавать временную таблицу, просто сделайте SELECT производной таблицей:
SELECT * FROM ( SELECT *, cost(id) as cost FROM plans WHERE plans.id IN (1,2,...) ) tmp AS t1 LEFT JOIN tmp AS t2 ON ...
или альтернативное решение с общим табличным выражением (для PostgreSQL 8.4 и выше)
with tmp as ( SELECT *, cost(id) as cost FROM plans WHERE plans.id IN (1,2,...) ) SELECT * FROM tmp as T1 LEFT JOIN tmp AS t2 ON ...
Похоже, вам нужно использовать функции окна, см. this пример.
Пример:
SELECT id, sum(cost) OVER (ORDER BY cost) FROM t1;