在Flink SQL中计算月同环比

同比和环比都是用来衡量数据变化的指标,但它们关注的时间周期不同。同比关注的是与去年同期数据的比较,而环比则是与上一个统计周期的数据进行比较。

同比的计算公式为:同比增长速度 = (本期发展水平 - 去年同期发展水平) ÷ 去年同期发展水平 × 100%。这个公式用于计算当前统计周期与去年同期统计周期相比的增长速度。

环比的计算公式为:环比增长率 = (本期数 - 上期数) ÷ 上期数 × 100%。这个公式用于计算连续两个统计周期(比如连续两月)内的量的变化比。

在运用这些公式时,需要确保数据的准确性和可比性,避免因为统计口径或计算方法的不一致而导致结果失真。同时,也要根据具体的需求和背景,选择合适的指标来衡量和分析数据的变化趋势。

在Flink SQL中计算月同环比通常涉及到窗口函数和条件逻辑。同环比通常用于比较当前月份与前一月份或去年同期月份的指标变化。

以下是一个基本的示例,展示了如何在Flink SQL中计算月同比(与去年同期相比)和月环比(与上一月相比)。假设verify_month字段的格式是YYYY-MM

首先,你需要计算出每个月的总数量(这里以quantity字段为例),然后基于这个总数量计算同比和环比。

计算月同比

同比是与去年同期相比的增长率。例如,2023年3月与2022年3月相比。

 

sql复制代码

SELECT
t1.verify_month,
t1.quantity AS current_month_quantity,
t2.quantity AS same_period_last_year_quantity,
CASE
WHEN t2.quantity = 0 THEN NULL -- 避免除以0的情况
ELSE (t1.quantity - t2.quantity) / t2.quantity * 100 -- 计算同比增长率
END AS year_on_year_growth_rate
FROM (
SELECT
verify_month,
SUM(quantity) AS quantity
FROM
ads_sa_region_product_month_cnt_df
GROUP BY
verify_month
) t1
LEFT JOIN (
SELECT
CONCAT(YEAR(verify_month) - 1, '-', SUBSTR(verify_month, 6)) AS verify_month, -- 获取去年同月的日期
SUM(quantity) AS quantity
FROM
ads_sa_region_product_month_cnt_df
GROUP BY
CONCAT(YEAR(verify_month) - 1, '-', SUBSTR(verify_month, 6))
) t2 ON t1.verify_month = t2.verify_month

计算月环比

环比是与上一月相比的增长率。例如,2023年3月与2023年2月相比。

 

sql复制代码

SELECT
t1.verify_month,
t1.quantity AS current_month_quantity,
t2.quantity AS previous_month_quantity,
CASE
WHEN t2.quantity = 0 THEN NULL -- 避免除以0的情况
ELSE (t1.quantity - t2.quantity) / t2.quantity * 100 -- 计算环比增长率
END AS month_on_month_growth_rate
FROM (
SELECT
verify_month,
SUM(quantity) AS quantity
FROM
ads_sa_region_product_month_cnt_df
GROUP BY
verify_month
) t1
LEFT JOIN (
SELECT
DATE_FORMAT(DATE_SUB(TO_DATE(verify_month), INTERVAL 1 MONTH), 'yyyy-MM') AS verify_month, -- 获取上一月的日期
SUM(quantity) AS quantity
FROM
ads_sa_region_product_month_cnt_df
GROUP BY
DATE_FORMAT(DATE_SUB(TO_DATE(verify_month), INTERVAL 1 MONTH), 'yyyy-MM')
) t2 ON t1.verify_month = t2.verify_month

注意:

  1. 这些查询假设verify_month字段是字符串类型,并且格式是YYYY-MM。如果格式不同,你需要相应地调整日期函数。
  2. 使用LEFT JOIN是为了处理那些没有前一月或去年同期数据的月份。这些月份在结果中会显示为NULL
  3. 为了避免除以0的情况,当去年同月或前一月的数量为0时,同环比计算结果为NULL。你可以根据实际情况调整这一逻辑。
  4. 这些查询仅计算了总数量(quantity)的同比和环比。如果你需要计算其他字段的同比和环比,只需将SUM(quantity)替换为相应的聚合函数和字段即可。
  5. Flink SQL的具体语法和函数可能因版本而异,上述示例基于常见的Flink SQL语法和功能。如果你使用的Flink版本有特定的语法或函数,请相应地调整查询。

第二种写法:

在 Flink SQL 中进行月同环比计算,通常需要有对照组数据来进行比较。同环比(即同期对比和环比)是两种常见的数据分析方法,用于衡量数据随时间的变化趋势。以下是两种计算方法的简要说明:

1. **同期对比(同环比)**:与同一年的前一年同期相比,例如比较 2022 年 1 月与 2021 年 1 月的数据。

2. **环比**:与前一个时间段相比,例如比较 2022 年 1 月与 2021 年 12 月的数据。

为了进行这些计算,您需要能够访问到历史数据,并且能够根据 `verify_month` 字段进行分组和比较。以下是一个简化的 SQL 示例,展示了如何计算同环比:

### 同期对比(同环比)的计算:

```sql
SELECT
  t1.verify_month,
  t1.product_type1,
  t1.so_region,
  SUM(t1.quantity) AS current_month_quantity,
  SUM(t2.quantity) AS previous_year_quantity,
  (SUM(t1.quantity) - SUM(t2.quantity)) AS quantity_change
FROM
  ads_sa_region_product_month_cnt_df t1
JOIN
  ads_sa_region_product_month_cnt_df t2
ON
  t1.product_type1 = t2.product_type1 AND
  SUBSTRING(t1.verify_month, 1, 4) = SUBSTRING(t2.verify_month, 1, 4) AND
  t2.verify_month = CONCAT(SUBSTRING(t1.verify_month, 1, 4) - 1, '-', LPAD(MONTH(t1.verify_month), 2, '0'))
GROUP BY
  t1.verify_month,
  t1.product_type1,
  t1.so_region;
```

### 环比的计算:

```sql
SELECT
  t1.verify_month,
  t1.product_type1,
  t1.so_region,
  SUM(t1.quantity) AS current_month_quantity,
  SUM(t2.quantity) AS previous_month_quantity,
  (SUM(t1.quantity) - SUM(t2.quantity)) AS quantity_change
FROM
  ads_sa_region_product_month_cnt_df t1
JOIN
  ads_sa_region_product_month_cnt_df t2
ON
  t1.product_type1 = t2.product_type1 AND
  SUBSTRING(t1.verify_month, 1, 4) = SUBSTRING(t2.verify_month, 1, 4) AND
  t2.verify_month = DATE_FORMAT(DATEADD(TO_DATE(t1.verify_month, 'yyyy-MM'), -1, MONTH), 'yyyy-MM')
GROUP BY
  t1.verify_month,
  t1.product_type1,
  t1.so_region;
```

在上述 SQL 示例中,我们使用了自连接(`JOIN`)来将同一个表与自身连接,以便将当前月份的数据与前一年同期或上个月的数据进行比较。`SUBSTRING` 和 `CONCAT` 函数用于构造去年同月的月份字符串,而 `DATEADD` 和 `TO_DATE` 函数用于计算上个月的日期。

请注意,这些示例假设您的 Flink SQL 环境支持相应的日期和字符串函数。您可能需要根据您的 Flink 版本和具体需求调整这些函数的使用。此外,您还需要确保历史数据的可访问性,以便进行有效的比较。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flink SQL,我们可以使用UDF(User-Defined Function)来使用自定义的聚合函数。对于基于TDigest实现的近似分位数统计函数,我们可以将它封装为一个UDF,然后在Flink SQL使用。 以下是UDF的代码实现: ```java import org.apache.flink.table.annotation.DataTypeHint; import org.apache.flink.table.functions.AggregateFunction; import org.apache.flink.table.functions.FunctionContext; import org.apache.flink.table.functions.ScalarFunction; import org.apache.flink.types.Row; import com.tdunning.math.stats.TDigest; public class ApproxQuantileUDF extends ScalarFunction { private double compression; private double quantile; private TDigest tdigest; public ApproxQuantileUDF(double compression, double quantile) { this.compression = compression; this.quantile = quantile; } @Override public void open(FunctionContext context) throws Exception { this.tdigest = TDigest.createDigest(compression); } public Double eval(Double value) { this.tdigest.add(value); return this.tdigest.quantile(quantile); } } ``` 在UDF的构造函数,我们需要传入两个参数,compression代表TDigest压缩的程度,quantile代表要计算的分位数。在open方法,我们使用TDigest.createDigest方法来创建一个TDigest实例。在eval方法,我们将每一个输入的数据加入到TDigest的实例,然后返回TDigest实例的分位数。 接下来,我们在Flink SQL使用UDF,示例代码如下: ```sql CREATE TEMPORARY SYSTEM FUNCTION approx_quantile_udf AS 'ApproxQuantileUDF' LANGUAGE JAVA; SELECT approx_quantile_udf(price, 0.9) AS price_quantile FROM orders; ``` 在这个示例,我们使用了approx_quantile_udf这个UDF来计算orders表price列的90%分位数。需要注意的是,我们需要先将ApproxQuantileUDF类编译打包成jar包,并将jar包添加到Flink的classpath,才能在Flink SQL使用该UDF。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值