zoukankan      html  css  js  c++  java
  • 深入浅出“跨视图粒度计算”--2、INCLUDE表达式

    此文已由作者王文开授权网易云社区发布。

    欢迎访问网易云社区,了解更多网易技术产品运营经验。


    上一篇,讲了什么是数据的粒度,以及网易有数中,哪些地方能够改变视图上的数据粒度。

    现在正是开始CGC表达式的讲解,我们首先来看一下INCLUDE表达式

    { INCLUDE [维度] : 聚合表达式 }

    我们用以下的示例数据来举个例子。这份数据显示了在2014年的1月和2月间,有A、B和C三个客户有一些花费记录。


                                              示例数据

    首先,我在网易有数中展示这两个月的花费总额,将“Date”字段放置在X轴,并且按照“月”的粒度。“Spend”放置在Y轴,聚合方式选择“求和”,得到下图。


    网易有数提供拖拽字段的交互方式来完成图表的绘制,但这张图表的背后其实是生成了一段SQL,如下:


                              图表对应的SQL和结果

    这段SQL很容易理解,就是对Date进行了Group by,然后对Spend进行了求和。

    每个月客户花费的平均总金额是多少

    此时,我想回答一个问题,我想知道“每个月客户花费的平均总金额是多少?”

    首先,我们还是先来仔细理解一下这个问题。

    请注意,“每个月客户花费的平均总金额是多少?” vs “每个月花费的平均总金额是多少?”是两个不同的问题。因为数据的粒度不一样。这个在网易有数里面该怎么做呢?

    其实如果用SQL语言是很容易实现的:


    这段SQL语言看似很复杂,但仔细一看,我们所做的只是从另一个查询返回的结果集中进行选择,即从红色框的子查询的结果中再进行选择。我们先来看一下,子查询返回的结果,如下表:


                                                       子查询结果

    然后我们再基于子查询中的结果,对Month做分组操作,得到月份平均值:


                                基于子查询求平均值

    最终得到下面的数据集。就是每月每个客户的平均总消费金额


                                      每月客户的平均总消费金额

    但这样做存在一个问题,就是为了计算到这个结果,数据必须进行预先汇总。在之前的网易有数中,唯一的解决方案是在数据模型中创建自定义SQL视图,先按月和客户预先汇总的好数据。但这种解决方案非常不理想。因为如果预先进行了汇总,就限制了我们将数据分成几周或几天的能力,并且我们无法再访问个人客户。

    好消息是,在新版本的网易有数中,再也不会被这类问题所烦恼了!


    跨视图粒度计算表达式(Cross-Granularity Calculation)能够让用户在表达式中指定数据的在哪个粒度上进行计算,

    INCLUDE表达式

    那我们现在来正式看一下INCLUDE表达式。在这里,我们将回答在文章开头部分提出的问题:“每个月客户花费的平均总金额是多少?”

    还记得以前的解决方案是有多复杂吗?而现在,你只需要创建一个计算字段:


                                                      客户总花费

    这就是你需要做的一切!

    于是,我们只需要把刚才创建的“客户总花费”拖到Y轴,然后聚合方式取平均值,得到下图


                                                           最终结果

    有关这张图表背后发生的更多细节,我们来看一下原始SQL脚本,并且比较一下SQL中的哪些部分与我们图表的数据面板上的字段对应:


    蓝色的 [Month] 对应的是我们X轴的字段 [月(Date)]

    绿色的 [AVG TOTAL SPEND] 对应于我们Y轴字段 [客户总花费]

    橙色的字段其实就是我们INCLUDE表达式中写的,INCLUDE,中文译为“包括”,可以形象的理解为:在计算时,除了当前图表数据面板上的粒度,还要将INCLUDE后面的粒度包括进去。所以我们看到在子查询中,我们会将【Month】也加到子查询里面。

    然后基于子查询的结果,再做一次顶层聚合,聚合回当前图表的视图粒度。

    是不是非常很方便!

    CGC表达式其实就是对SQL的高度抽象,能够不依赖图表上的粒度,自由的指定度量的计算粒度。通过非常简洁的语法能够满足复杂的分析需求。

    这样就能够在一张图表上展示不同粒度的数据了。比如下图,视图上面虽然只有Date粒度,但是在显示的时候,能够将数据聚合到不同的粒度。


    展示

    以上内容讲了INCLUDE表达式的原理,后续我会继续对EXCLUDE、FIXED表达式进行讲解!


    网易有数:企业级大数据可视化分析平台,具有全面的安全保障、强大的大数据计算性能、先进的智能分析、便捷的协作分享等特性。点击可免费试用


    相关文章:
    【推荐】 ==vs===inJavascript

  • 相关阅读:
    Redis(二)
    Redis
    Nginx
    Linux的环境配置
    深入mysql
    SpringBoot入门
    Thymeleaf入门
    Mybatis之resultMap
    Mybatis入门
    使用第三方实现微信登录
  • 原文地址:https://www.cnblogs.com/zyfd/p/9921759.html
Copyright © 2011-2022 走看看