5. 带条件的聚合统计

核心思路

  • 一般的做法是group by xx,yy 再多次的sum(if(......)),在行转列中也用过这个技巧了,即把符合某条件的才进行统计
  • 好处是避免多次加载表,得到多个指标,可以只加载一次表就得到多个指标。

小米电商

要求:编写SQL能运行,数据正确且符合规范,如遇到自定义函数或不记得的函数可以用XX代替

  1. 已知有如下两个表表sale:字段如下
Create table sale_order(
    Order_id bigint comment '订单ID',
    User_id bigint comment '用户ID',
    Order_status int,
    Create_time string,
    Last_update_time string,
    Product_id bigint,
    Product_num bigint 
);
  1. 用户注册表:
Create table user_info(
    user_id bigint comment'用户ID,唯一主键',
    sex string.
    age int
);

问题:用一条SQL生成完整的用户画像表,包含如下字段:

user_id, sex, age, d7order_num, d14_order_num,后面两个字段分别为近7天订单数量,近14天订单数量。

create table sale_order(
    order_id bigint comment '订单ID',
    user_id bigint comment '用户ID',
    order_status int ,
    create_time string,
    last_update_time string,
    product_id bigint,
    product_num bigint
);
create table user_info(
    user_id bigint comment '用户ID,唯一主键',
    sex string,
    age int
);

select u.*,
       s.d7order_num,
       s.d14order_num
from user_info u
left join (
	select user_id,
          count(if(create_time >= '7天前'  and create_time <= '今天', order_id,null)) as d7order_num,
          count(if(create_time >= '14天前' and create_time <= '今天', order_id,null)) as d14order_num
    from sale_order
    where create_time >= '14天前'
    group by user_id) s 
on u.user_id = s.user_id;
Elasticsearch 聚合结果字段可以使用 Sub Aggregation 来实现。Sub Aggregation 是在一个 Aggregation 中嵌套另一个 Aggregation,可以对上一层聚合结果进行进一步的分析,包括对字段进行统计、排序等操作。 以下是一个简单的示例代码,实现按照某个字段进行分组,并统计每个分组中另一个字段的平均值: ```java SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 构建聚合条件,按照字段1分组 TermsAggregationBuilder aggregationBuilder1 = AggregationBuilders.terms("agg_name1").field("field1"); // 构建子聚合条件统计字段2的平均值 AvgAggregationBuilder aggregationBuilder2 = AggregationBuilders.avg("agg_name2").field("field2"); // 将子聚合条件添加到父聚合条件中 aggregationBuilder1.subAggregation(aggregationBuilder2); // 将聚合条件添加到搜索请求中 searchSourceBuilder.aggregation(aggregationBuilder1); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 获取聚合结果 Terms aggResult1 = searchResponse.getAggregations().get("agg_name1"); // 遍历每个分组,获取子聚合结果 for (Terms.Bucket bucket : aggResult1.getBuckets()) { Avg aggResult2 = bucket.getAggregations().get("agg_name2"); double avg = aggResult2.getValue(); System.out.println("Field1: " + bucket.getKeyAsString() + ", Avg of Field2: " + avg); } ``` 需要注意的是,Sub Aggregation 可以嵌套多层,可以根据具体需求进行扩展。同时还可以使用 Bucket Sort Aggregation 对分组结果进行排序,或使用 Bucket Selector Aggregation 对分组结果进行筛选。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值