我正在尝试使用“具有”查询来过滤从组中获取的数据。为此,我需要在hading子句中多次使用相同的聚合函数(min(x)和max(x))。这不起作用,我收到一条错误消息
“原始异常:代码:184,e.displayText()= DB :: Exception:在查询的另一个聚合函数内部发现了聚合函数min(strike),e.what()= DB :: Exception” >
我试图在顶部的select子句中将min和max定义为min_strike和max_strike,并在hading子句中使用它。这也不起作用。
编辑:编辑了代码,忘记添加条件。
select
<<structureid and some other variables>>
from
<<a huge query, including multiple joins>>
group by structureid
having min(strike)!=max(strike)
and sumIf(notional,strike=min(strike))>0
这个想法是将过滤器精确地应用在其分组的位置。
例如:
structure id | strike | notional
1 | 1.10 | 10
1 | 1.12 | -10
2 | 1.10 | -10
2 | 1.12 | 10
3 | 1.10 | -10
3 | 1.10 | 10
在这种情况下,我要过滤出structureid = 2并仅选择structureid = 1,这样我的结果表将如下所示:
structure id | min strike | max strike
1 | 1.10 | 1.12
编辑:我现在正在使用某种“自我连接”来执行此操作,该操作似乎也未在Clickhouse中实现,所以我最终做了
<<a huge query, including multiple joins>>
两次。我按结构ID对其中一张表进行分组,并计算所有汇总值。另一个未分组。然后,我通过structureid(使用“所有内部联接”)将它们联接,然后将过滤器应用于组合表:
select final variables
(
select
<<a lot of unaggregated variables>>
from
<<a huge query, including multiple joins>>
group by structureid
)
all inner join
(
select
<<min(strike) as min_strike, max(strike) as max_strike, and other
aggregate variables>>
from
<<a huge query, including multiple joins>>
group by structureid
)
using structureid
where min_strike!=max_strike and (notional>0 and strike=min_strike)
这似乎效率极低。但是我想不出另一种解决方案。任何如何更好地实现这一点的想法将不胜感激!