我试图通过使用“having”查询来过滤从组中获取的数据。为此,我需要在having子句中多次使用相同的聚合函数(min(x)和max(x))。这不起作用,我收到一个错误消息
“原始异常:代码:184,e.displaytext()=db::exception:在查询中的另一个聚合函数中找到聚合函数min(strike),e.what()=db::exception”
我试图在顶部的select子句中将min和max定义为min\u strike和max\u strike,并在having子句中使用它。这也行不通。
编辑:编辑代码,忘记添加条件。
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(使用'all inner join')将它们连接起来,并对组合表应用筛选器:
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)
这似乎效率极低。但我想不出别的解决办法。任何如何更好地实现这一点的想法都将不胜感激!
暂无答案!
目前还没有任何答案,快来回答吧!