在同一having子句中使用相同的聚合函数多次

sg24os4d  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(0)|浏览(287)

我试图通过使用“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)

这似乎效率极低。但我想不出别的解决办法。任何如何更好地实现这一点的想法都将不胜感激!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题