如何根据聚合求取各种数值指标

本文详细介绍了如何在 Elasticsearch 中通过聚合分析获取各种数值指标,如平均值、总和、最大值和最小值。通过具体的DSL查询示例,展示了如何筛选男性购买不同类别商品的平均价格,并讨论了脚本聚合的应用,以及cardinality和value_count在统计唯一值和总数时的使用。文章总结了聚合的基本概念和应用,强调了聚合在数据分析中的重要性。

聚合分析是非常重要的一种分析方式,因为只有把相同特征的数据聚合到一起,你才能看到问题的本质。聚合的本质其实就是一个分组的概念,比如说求解某个指标的平均值、极大值、极小值、方差等,都可以使用聚合分析来做。同样你也可以选择把数据都取回来,然后在本地统计,但是你需要考虑到网络的问题,如果数据比较多,就会一直占用 ES 资源,另外一个问题是,你本地内存是否够用、运算时间较长等问题,ES 是分布式的,性能强大,统计需求完全可以放在 ES 来做,然后返回结果。

在前面的课时上,有介绍如何使用 Kibana 做聚合分桶,然后将结果可视化。但是有时候这远远不能满足我们的需求,可能我们需要统计值来其他需求上的支持,或者需要把统计值加上业务逻辑,这个时候就需要把统计值取回来,而不是在 Kibana 上做可视化分析。取是个关键步骤,最关键的还是如何取?DSL 该如何写?

指标聚合

指标来自于文档的某个字段,有的聚合会产生单个值,这个被叫做单值数字指标聚合,像求取平均值的聚合 avg,有的则会产生多个值,被称作多值数据指标聚合,像 stats。聚合的过程也就是分桶的过程,粗浅一点就是 group by 的过程,根据什么来进行分组数据?

使用 Kibana 自带的电子商务订单索引为案例的数据索引。

sum、avg、min、max

给定需求:

男人在购买不同类别商品上单的平均值是多少?

分析这个需求,首先是要把男人的购买记录筛选出来,然后再根据商品的类别分桶,SQL 里面可以表示为 group by '商品类别'

<think>我们之前讨论过原子指标的历史数值查看方法,现在用户询问的是派生指标的历史数值如何查看。 根据引用[2]的定义,派生指标是在基础指标(原子指标)的基础上,通过某个特殊维度(如时间、渠道等)计算出的指标。 用户的问题:如何查看派生指标的历史数值? 分析: 1. 派生指标本身已经包含了特定的维度(比如时间周期、业务限定等),例如“昨日订单总额”就是一个包含时间周期的派生指标。 2. 但是,用户现在想要查看这个派生指标的历史数值,比如想要查看“昨日订单总额”在过去30天每天的值(即历史趋势)。 关键点: 派生指标的定义中已经包含了一个时间周期(如“昨日”),那么要查看其历史数值,实际上需要将这个派生指标中的时间周期扩展为多个连续的时间周期(如连续多天),形成一个新的时间序列。 因此,查看派生指标的历史数值,本质上是将派生指标中的固定时间周期替换为可变的时间周期(如按天、周等),然后计算每个时间周期的值。 步骤: 1. 解析目标派生指标的结构:分解出原子指标、时间周期、业务限定(如果有的话)。 2. 将时间周期从固定值(如“昨日”)变为一个时间范围(如“过去30天”),然后按更细粒度的时间(如天)聚合。 3. 在数据仓库中执行查询,按时间维度分组计算。 举例: 假设已有派生指标:昨日订单总额(定义为:原子指标“订单总额”+时间周期“昨日”) 现在要查看这个派生指标的历史数值(比如过去7天每天的“昨日订单总额”实际上就是过去7天每天的前一天的订单总额?) 注意:这里要区分清楚,用户可能想要的是这个派生指标本身所代表的意义在历史时间点上的值。 实际上,更常见的需求是:派生指标“昨日订单总额”代表的是每天的前一天的订单总额。那么要查看这个指标的历史数值,就是查看过去每一天(作为计算日期)所计算出的“昨日订单总额”的值,这样就形成了一个时间序列。 实现方法: 在数据仓库中,通常我们会存储原子指标相关的原始事实表(带有时间戳)。对于派生指标,我们可以通过以下步骤获取其历史数值: 方法1:重新定义派生指标的时间周期 - 原始派生指标:昨日订单总额 = 订单总额(原子指标) + 时间周期(昨日) - 要查看历史数值,我们创建一个新的派生指标(或临时查询),例如:每日的昨日订单总额(即每天计算前一天的订单总额),然后按日期排列。 方法2:使用时间序列查询 - 在事实表中,我们通常有日期维度。假设我们有一个订单事实表,包含字段:`order_date`(日期),`order_amount`(订单金额)。 - 原子指标“订单总额”就是按某个日期(或时间范围)汇总的`order_amount`。 - 派生指标“昨日订单总额”的常规计算是:取日期为昨天的所有订单金额求和。 - 要查看这个派生指标的历史数值(比如过去30天每天的值),我们可以这样查询: ```sql SELECT date_sub(order_date, INTERVAL 1 DAY) AS report_date, -- 报告日期(即计算日期) SUM(order_amount) AS yesterday_order_total FROM orders_fact_table WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31' -- 假设我们想查看2024年1月每天的前一天订单总额 GROUP BY order_date ``` 但是注意:这样查询得到的是每个自然日(order_date)的订单总额,而我们想要的是每个计算日期的“昨日订单总额”。实际上,对于每个计算日期(比如2024-01-02),我们想要的是2024-01-01的订单总额。因此,我们可以调整: ```sql -- 计算每个计算日期(即报告日期)的昨日订单总额 -- 报告日期 = 订单日期 + 1天(因为订单日期是报告日期的前一天) SELECT order_date + INTERVAL 1 DAY AS report_date, SUM(order_amount) AS yesterday_order_total FROM orders_fact_table WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY order_date ``` 这样,我们就可以得到每个报告日期(report_date)对应的昨日订单总额(yesterday_order_total)。这个结果集就是派生指标“昨日订单总额”在2024-01-02到2024-02-01期间的历史数值。 方法3:使用BI工具 - 在BI工具(如Tableau)中,可以创建一个计算字段: 昨日订单总额 = { FIXED [日期] : SUM( IF [订单日期] = [日期]-1 THEN [订单金额] ELSE 0 END ) } 然后,将“日期”字段连续,将“昨日订单总额”拖到数值轴,即可形成历史趋势图。 注意事项: - 派生指标可能包含多个维度(如渠道、城市等),在查看历史数值时,需要确定是否要同时展示这些维度的历史变化,还是仅看汇总的历史变化。 - 如果派生指标包含业务限定(如“微信支付的订单总额”),则在查询中需要加入相应的过滤条件。 总结: 查看派生指标的历史数值,需要将派生指标中的固定时间周期扩展为连续的时间序列,并通过聚合计算得到每个时间点的值。核心步骤是: 1. 解析派生指标的组成(原子指标、时间周期、业务限定)。 2. 将时间周期替换为连续的时间范围(按天、周等)。 3. 在数据仓库中执行按时间分组的聚合查询。 因此,回答用户的问题:可以通过编写时间序列查询或使用BI工具来生成派生指标的历史数值序列。 根据引用[1]中提到的,分析数据效果时,会使用目标对比、横向对比、历史比较等方式,所以查看历史数值是进行历史比较的基础[^1]。 根据引用[3],全流程分析中,在每一个层级上又会有不同关注点和类别的指标,因此派生指标的历史数值分析也是这种纵向分析的一部分[^3]。</think>要查看派生指标的历史数值,需要根据其组成结构(原子指标+时间周期+业务限定)设计特定的数据查询和分析方法。以下是具体实现步骤和最佳实践: --- ### 一、查看派生指标历史数值的核心方法 #### 1. **解析派生指标结构** - 派生指标 = 原子指标 + 时间周期 + 业务限定 [^2] - 示例: `近7天微信支付订单总额 = 订单总额(原子指标) + 时间周期(近7天) + 业务限定(支付方式=微信)` #### 2. **时间维度扩展法**(核心方法) - **原理**:将派生指标中的固定时间周期(如“近7天”)转换为动态时间序列 - **操作步骤**: 1. 提取原子指标计算逻辑(如 `SUM(订单金额)`) 2. 保留业务限定条件(如 `支付方式='微信'`) 3. 将时间周期替换为连续时间轴(如按天/周分组) - **SQL实现示例**: ```sql /* 查看“微信订单总额”的每日历史值 */ SELECT date, -- 时间维度 SUM(order_amount) AS daily_value -- 原子指标计算 FROM orders_fact WHERE payment_channel = '微信' -- 业务限定 GROUP BY date -- 按时间序列聚合 ORDER BY date DESC; ``` #### 3. **时间窗口滑动计算**(动态趋势分析) - 适用于滚动周期指标(如近30天均值) - **BigQuery示例**: ```sql /* 每日更新“近7天微信订单总额”历史值 */ SELECT date, SUM(SUM(order_amount)) OVER ( ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS rolling_7d_total FROM orders_fact WHERE payment_channel = '微信' GROUP BY date ``` --- ### 二、技术实现最佳实践 #### 1. **数据建模设计** | 组件 | 存储位置 | 历史分析关键设计 | |----------------|-------------------|------------------------------| | 原子指标逻辑 | 元数据管理系统 | 确保可复用性 | | 业务限定条件 | 维度表 | 建立维度代理键 | | 时间序列数据 | 事实表分区字段 | 按日期分区存储(如`date_key`)| #### 2. **BI工具配置** - **Tableau/帆软**: 1. 将时间字段拖入列区域 2. 派生指标拖入行区域(自动触发原子指标聚合) 3. 添加业务限定筛选器 ![](https://example.com/bi_trend.png) *图示:派生指标历史趋势看板[^3]* #### 3. **实时监控方案** ```mermaid graph LR A[数据源] --> B{流处理引擎} B -->|计算派生指标| C[时间窗口聚合] C --> D[写入时序数据库] D --> E[Grafana可视化] E --> F[阈值告警] ``` - 工具链:Kafka + Flink + InfluxDB + Grafana --- ### 三、典型应用场景分析 #### 1. **业务趋势诊断** - **案例**:分析“促销期间微信支付占比”的周变化 ```python # Python分析示例 df['wechat_ratio'] = df['wechat_orders'] / df['total_orders'] df.plot(x='week', y='wechat_ratio', kind='line') ``` *输出:识别支付渠道偏好迁移拐点[^1]* #### 2. **异常值检测** - 方法:计算历史波动区间 $$ \text{正常范围} = \mu \pm 3\sigma,\ \ \mu=\text{均值},\ \sigma=\text{标准差} $$ - 触发条件:当日值 $x_i \notin [\mu-3\sigma, \mu+3\sigma]$ #### 3. **指标关联分析** | 派生指标A | 派生指标B | 关联分析方法 | |-------------------|-------------------|-------------------| | 新客转化率 | 广告投放量 | 交叉相关性分析 | | 库存周转率 | 促销折扣率 | 格兰杰因果检验 | --- ### 四、常见问题解决方案 1. **数据延迟问题** - 方案:在派生指标定义中添加`数据就绪标记`字段 ```sql SELECT date, SUM(amount) AS value, MAX(data_ready_flag) AS is_valid -- 确保数据完整性 FROM fact_table GROUP BY date HAVING is_valid = 1 ``` 2. **历史数据重算** - 场景:业务规则变更时 - 流程: ```mermaid graph TB A[触发重算规则] --> B[锁定影响时间段] B --> C[按新逻辑回刷数仓] C --> D[更新BI语义层] ``` --- ### 结论 查看派生指标历史数值需通过**时间维度扩展**实现,关键在于: 1. 解构派生指标三要素(原子指标/时间周期/业务限定) 2. 将固定时间周期转化为连续时间序列 3. 利用时序数据库或数仓分区优化查询性能[^2][^3] > 例如:分析“二线城市GMV占比”的季度变化时,需将原子指标(GMV)与空间维度(城市等级)结合,再按季度时间轴聚合历史值[^1]。 --- ### 相关问题 1. 如何设计支持历史回溯的派生指标元数据系统? 2. 派生指标历史数据分析中怎样处理统计显著性? 3. 时间窗口类派生指标(如MAU)的历史计算有哪些优化方案?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值