Передать столбец агрегатной функции с самостоятельным левым соединением

0

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

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

  • 0
    Что делает функция cost ()? Вы не даете этому никакой информации. Как будет рассчитываться второй столбец затрат, если функция cost () имеет входные параметры из таблиц?
  • 0
    Хорошо, я поставил «id», чтобы он мог ссылаться на строку.
Показать ещё 2 комментария
Теги:
join
left-join

2 ответа

2
Лучший ответ

Нет необходимости создавать временную таблицу, просто сделайте 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 ...
  • 0
    Именно то, что мне было нужно! Благодарю.
  • 0
    Postgresql, похоже, не нравится этот синтаксис, но идеи правильные.
Показать ещё 2 комментария
1

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

Пример:

SELECT id, sum(cost) OVER (ORDER BY cost) FROM t1;
  • 0
    Я тоже думал об этом, но я до сих пор не понял, каков реальный вопрос ...
  • 0
    Я постараюсь использовать это сегодня.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню