在相同的具有子句的多重时间中使用相同的聚合函数

时间:2019-06-12 09:13:10

标签: sql clickhouse

我正在尝试使用“具有”查询来过滤从组中获取的数据。为此,我需要在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)

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

0 个答案:

没有答案