繁体   English   中英

通过自左联接传递聚合函数列

[英]Pass aggregate function column with self left join

我想在列上调用一次汇总函数(成本),然后通过自左联接(用于创建排列或行的组合)将其级联。 这样,我计算出成本是在联接O(row ^ joins)之后调用它的O(n)。 首先是这样的:

id | cost 
----------
1  |  5   
2  |  10  

我想做类似下面的事情。 我可以对select进行临时表操作,然后将其联接起来,但我想避免使用临时表

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 ...

听起来像是你需要使用的窗函数看到这个例子。

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM