You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一条Elasticsearch ES|QL查询中同时实现分组求和及求和项的占比计算

如何在同一条Elasticsearch ES|QL查询中同时实现分组求和及求和项的占比计算

我懂你现在的困扰:已经用ES|QL按device_type和user_category做了分组求和,但想给每个分组的view_time算个占比,却卡在拿不到全局的总view_time上。其实不用拆成两次查询,用ES|QL的窗口函数就能在同一条语句里搞定这件事!

直接给你整合好的完整查询,把你要的所有逻辑都包含进去了:

FROM test_index
WHERE start_time >= DATE_PARSE("yyyy-MM-dd'T'HH:mm:ssXXX", "2025-08-01T00:00:00Z") 
  AND start_time <= DATE_PARSE("yyyy-MM-dd'T'HH:mm:ssXXX", "2025-08-20T00:00:00Z")
-- 按需求完成分组统计,拿到每个组的基础聚合值
STATS 
  views_total = SUM(1), 
  view_time = SUM(view_time) 
BY device_type, user_category
-- 新增窗口函数计算全局总时长,再推导占比
EVAL 
  total_view_time = SUM(view_time) OVER(), -- 空OVER()表示取整个数据集的总和
  view_time_mins = ROUND(TO_DOUBLE(view_time) / 60.0, 2),
  view_time_percent = ROUND(TO_DOUBLE(view_time) / total_view_time * 100, 2) -- 计算占比并转成百分比格式

给你拆解下关键的解决点:

  • 核心就是SUM(view_time) OVER():这个窗口函数会忽略之前的分组,直接计算整个查询结果集的view_time总和,刚好就是你要的全局总时长,不用额外跑一次无分组的统计。
  • 占比计算部分:用当前分组的view_time除以全局总时长,乘以100转成百分比,再用ROUND保留两位小数,结果更直观。
  • 你原来的时间过滤、统计访问量、转时长为分钟的逻辑都完整保留,没有改动。

这样跑出来的结果里,每个分组就会同时展示自身的访问量、总时长、时长(分钟),以及该分组时长在全局总时长中的占比啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:23:09