sql—如何根据一列中满足条件的值的总和来选择行?

m3eecexj  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(395)

我有一个表,其中存储了客户端与网页之间的交互类型(为了清晰起见简化了)。这些列是:月、客户机id、交互类型、进行交互的次数

month    clientId   interactionType   numberOfInteractions  
 --------- ---------- ----------------- ---------------------- 
  2020-01        123   click                                1  
  2020-01        123   scroll                               2  
  2020-01        123   hover                                1  
  2020-01         89   click                                12 
  2020-01         65   hover                                6  
  2020-01         65   scroll                               8  
  2020-02         89   click                                12 
  2020-02         89   scroll                               9

我每月只想选择交互总数大于每个客户端阈值的条目。
例如,如果我选择的值为4,则只会选择scroll、hover和click之间交互总数大于或等于4的客户机条目。将此逻辑应用于我的表,将返回所有8个条目。
但是,如果我将阈值更改为10,则只返回以下条目(因为每个交互类型、每个客户端、每个月的numberofinteractions之和大于10)

month    clientId   interactionType   numberOfInteractions  
 --------- ---------- ----------------- ---------------------- 
  2020-01         89   click                                12 
  2020-01         65   hover                                6  
  2020-01         65   scroll                               8  
  2020-02         89   click                                12 
  2020-02         89   scroll                               9

我的解决方案是创建一个cte,将按月份和clientid分组的交互数相加,然后将其连接到原始表中。例如

with temp as (
select 
   i.*,
   sum(numberOfInteractions)
from
   interactions a
group by
   a.month,
   a.clientId,
   a.interactionType,
   a.numberOfInteractions
)
select
   *
from
   interactions b
join
   temp on temp.month = b.month and temp.clientId = b.clientId

有人能推荐一个允许在聚合级别进行这种过滤的查询吗?

svujldwt

svujldwt1#

使用窗口功能:

select i.*
from (select i.*,
             sum(numberOfInteractions) over (partition by month, clientId) as month_cnt
      from interactions i
     ) i
where month_cnt > 4;

相关问题