Передать столбец агрегатной функции с самостоятельным левым соединением - PullRequest
0 голосов
/ 25 ноября 2010

Я хотел бы вызвать агрегатную функцию (стоимость) один раз для столбца и каскадировать ее через самостоятельные левые соединения (используется для создания перестановки или комбинации строк).Таким образом, я считаю, что стоимость - это 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   |

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

Нет необходимости создавать временную таблицу, просто сделайте ваш 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 ...
1 голос
/ 25 ноября 2010

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

Пример:

SELECT id, sum(cost) OVER (ORDER BY cost) FROM t1;
...