如何在同一条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
相关产品推荐
相关产品推荐

