数仓ADS层指标计算案例分享

ADS层数据往往是最终的结果指标数据,在大屏展示,或者实时流处理时候使用,通过下面两个例子来练习业务大屏展示sql该怎么写。

1. 会员分析案例

1.1 数据准备

表结构如下,其中此表是dws层以天为维度的会员表,比如每天的会员信息汇总,

use dws;
drop table if exists dws.dws_member_start_day;
create table dws.dws_member_start_day(
`device_id` string, -- 设备id,来区分用户
`uid` string, -- uid
`app_v` string,
`os_type` string,
`language` string,
`channel` string,
`area` string,
`brand` string
) COMMENT '会员日启动汇总'
partitioned by(dt string)
stored as parquet;

1.2 会员指标计算

沉默会员的定义:只在安装当天启动过App,而且安装时间是在7天前;
流失会员的定义:最近30天未登录的会员

1.2.1 如何计算沉默会员数

-- 关键点在于只启动一次
-- 拿到只启动一次的会员,后面再过滤安装时间是再7天前的,使用sum窗口函数
SELECT count(*)
FROM(SELECT device_id,sum(device_id) OVER (PARTITION BY device_id) AS sum_num,dtFROM dws.dws_member_start_day) tmp
WHERE dt <= date_add(CURRENT_DATE, -7)AND sum_num=1

1.2.2 如何计算流失会员数

-- 关键点在于最近一次登录
-- 拿到会员最近一次登录时间,并用row_number来过滤
SELECT count(*)
FROM(SELECT device_id,dt,row_number() OVER (PARTITION BY device_idORDER BY dt DESC) roFROM dws.dws_member_start_day) tmp
WHERE ro=1AND dt >= date_add(CURRENT_DATE, -30)

2. 核心交易案例

2.1 数据准备

给定一个每日订单维度表,表结构如下:

-- 订单明细
DROP TABLE IF EXISTS dwd.dwd_trade_orders;
create table dwd.dwd_trade_orders(
`orderId`    int,
`orderNo`   string,
`userId`    bigint,
`status`    tinyint,
`productMoney` decimal,
`totalMoney`  decimal,
`payMethod`   tinyint,
`isPay`     tinyint,
`areaId`    int,
`tradeSrc`   tinyint,
`tradeType`   int,
`isRefund`   tinyint,
`dataFlag`   tinyint,
`createTime`  string,
`payTime`   string,
`modifiedTime` string,
`start_date`  string,
`end_date`   string
) COMMENT '订单事实拉链表'
partitioned by (dt string)
STORED AS PARQUET;

其中,订单状态 -3 用户拒收;-2未付款的订单;-1用户取消;0 待发货;1配送中;2用户确认收货,订单有效标志;-1 删除;1 有效。

数据预处理,在明细事实拉链表处理时不太方便,可以做一张中间表,dws_trade_orders_day 其表结构和加工如下:

DROP TABLE IF EXISTS dws.dws_trade_orders_day;CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_day(day_dt string COMMENT '日期:yyyy-MM-dd',day_cnt decimal commnet '日订单笔数',day_sum decimal COMMENT '日订单总额') COMMENT '日订单统计表';SELECT dt,count(*) cnt,sum(totalMoney) sm
FROM(SELECT DISTINCT orderid,dt,totalMoneyFROM dwd.dwd_trade_ordersWHERE status >= 0AND dataFlag = '1') tmp
GROUP BY dt;INSERT OVERWRITE TABLE dws.dws_trade_orders_day
SELECT dt,count(*) cnt,sum(totalMoney) sm
FROM(SELECT DISTINCT orderid,dt,totalMoneyFROM dwd.dwd_trade_ordersWHERE status >= 0AND dataFlag = '1') tmp
GROUP BY dt;SELECT *
FROM dws.dws_trade_orders_day
WHERE day_dt BETWEEN '2020-01-01' AND '2020-12-31';

2.2 指标1,统计2020年每个季度的销售订单笔数、订单总额

先创建ads指标表:dws_trade_orders_quarter

DROP TABLE IF EXISTS dws.dws_trade_orders_quarter;CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_quarter(YEAR string COMMENT '年份',QUARTER string COMMENT '季度',cnt decimal COMMENT '订单总笔数',SUM decimal COMMENT '订单总额') COMMENT '季度订单统计表';INSERT OVERWRITE TABLE dws.dws_trade_orders_quarter WITH tmp AS(SELECT substr(day_dt, 0, 4) YEAR,CASE WHEN substr(dat_dt, 6, 2)="01"OR substr(dat_dt, 6, 2)="02"OR substr(day_dt, 6, 2)="03" THEN "1" WHEN substr(dat_dt, 6, 2)="04"OR substr(dat_dt, 6, 2)="05"OR substr(day_dt, 6, 2)="06" THEN "2" WHEN substr(dat_dt, 6, 2)="07"OR substr(dat_dt, 6, 2)="08"OR substr(day_dt, 6, 2)="09" THEN "3" WHEN substr(dat_dt, 6, 2)="10"OR substr(dat_dt, 6, 2)="11"OR substr(day_dt, 6, 2)="12" THEN "4" AS QUARTER day_cnt,day_sumFROM dws.dws_trade_orders_day)
SELECT YEAR,QUARTER,sum(day_cnt),sum(day_sum)
FROM tmp
GROUP BY YEAR QUARTER;

2.3 统计2020年每个月的销售订单笔数、订单总额

先创建ads指标表:dws_trade_orders_month

DROP TABLE IF EXISTS dws.dws_trade_orders_month;CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_month(yearstring COMMENT '年份',MONTH string COMMENT '月份',month_cnt decimal COMMENT '月订单总笔数',month_sum decimal COMMENT '月订单总额') COMMENT '月订单统计表';INSERT OVERWRITE TABLE dws.dws_trade_orders_month WITH tmp AS(SELECT substr(day_dt, 0, 4) YEAR,sunstr(day_dt, 6, 2) MONTH,day_cnt,day_sumFROM dws.dws_trade_orders_day)
SELECT YEAR,MONTH,sum(day_cnt) month_cnt,sum(day_sum) month_sum
FROM tmp
GROUP BY YEAR,MONTH;

2.4 统计2020年每周(周一到周日)的销售订单笔数、订单总额

创建ads层指标表:dws_trade_orders_week利用到日期函数```weekofyear

DROP TABLE IF EXISTS dws.dws_trade_orders_week;
CREATE TABLE IF NOT EXISTS dws.dws_trade_orders_week(YEAR string COMMENT '年份',WEEK string COMMENT '一年中的第几周',week_cnt decimal COMMENT '周订单总笔数',week_sum decimal COMMENT '周订单总额') COMMENT '周订单统计表';INSERT OVERWRITE TABLE dws.dws_trade_orders_week
SELECT substr(day_dt, 0, 4) YEAR,weekofyear(day_dt) WEEK,sum(day_cnt),sum(day_sum)
FROM dws.dws_trade_orders_day
GROUP BY substr(day_dt, 0, 4) YEAR,weekofyear(day_dt) WEEK;

2.5 统计2020年国家法定节假日、休息日、工作日的订单笔数、订单总额

创建日期信息维表:dim_day_info 并录入节假日信息数据(数据每年都不一样,需要国务院通知的公告,所以定期手动维护)

drop table if exists dim.dim_day_info;
create table if not exists dim.dim_day_info(day_dt string comment '日期',is_holidays int comment '节假日标识:0不是 1是',is_workday int comment '工作日标识 0不是 1是'
) comment '日期信息表';-- 统计2020节假日的订单笔数,订单总额SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_holiday = 1;-- 统计2020年休息日的订单笔数,订单总额SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 0;-- 统计2020节工作日的订单笔数,订单总额SELECT nvl(sum(day_cnt), 0) nvl(sum(day_sum), 0)
FROM dws.dws_trade_orders_day A
LEFT JOIN dim.dim_day_info B ON A.day_dt = B.day_dt
WHERE B.is_workday = 1;

作者:Hoult丶吴邪

来源:大数据真有意思

数仓ADS层指标计算案例分享相关推荐

  1. 数仓 DW层中主题表之页面交互事件概况主题(分享,点赞,收藏)

    数仓 DW层中主题表之页面交互事件概况主题(分享,点赞,收藏) 1. 背景 在大数据开发中,本身的数据处理分析目的一般就是2类,一个是基于现有数据找出规律,做总结和分类统计.一个是基于现有数据找出规律 ...

  2. 数仓 DW层 用户留存分析主题

    数仓 DW层 用户留存分析主题 1. 背景 在app运营和产品设计中,一般都是拉新和留存2个最关键指标来衡量对用户的吸引力程度. 拉新,顾名思义, 拉新用户进来 留存,顾名思义,让用户留下来,这里面有 ...

  3. 数仓(十)从0到1简单搭建加载数仓DWS层

    数仓(一)简介数仓,OLTP和OLAP 数仓(二)关系建模和维度建模 数仓(三)简析阿里.美团.网易.恒丰银行.马蜂窝5家数仓分层架构 数仓(四)数据仓库分层 数仓 (五) 元数据管理系统解析 数仓( ...

  4. 从0到1搭建数仓DWD层案例实践

    关注公众号:大数据技术派,回复资料,领取1024G资料. 然后点击右上角 "设为星标" 比别人更快接收好文章 前 导读:数仓架构(ods-dwd-dws-ads)每一层之前我们已经 ...

  5. 如何创建数仓指标体系?指标建模的基础理论

    数仓指标体系建模方法 1.指标体系 2.指标建设过程中遇到的问题 3.指标建设方法论 3.1.北极星指标 3.2.OSM+UJM 模型 4.指标的构成 4.1.指标分类 4.2.指标分级 5.如何设立 ...

  6. 数仓(六)从0到1简单搭建数仓ODS层(埋点日志 + 业务数据)

    数仓(一)简介数仓,OLTP和OLAP 数仓(二)关系建模和维度建模 数仓(三)简析阿里.美团.网易.恒丰银行.马蜂窝5家数仓分层架构 数仓(四)数据仓库分层 数仓(五)元数据管理系统解析 最近工作一 ...

  7. 基于hive数仓的游戏指标分析

    目录 一.分析指标数据 二.基础层数据处理 1.先把全部数据导入到HDFS中 2.创建一个外部表,将数据导入到hive中 3.分割txt文件中的数据 4.取出需要的值,并建表 5.检查数据日期 三.设 ...

  8. 【博学谷学习记录】超强总结,用心分享|大数据之数仓分层

    数仓是什么? 数据仓库,简称数仓,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合.它是单个数据存储,出于分析性报 ...

  9. 数仓ODS,DWD,DWS层

    数据仓库中的数据表,往往是分层管理.分层计算的: 所谓分层,具体来说,就是将大量的数据表按照一定规则和定义来进行逻辑划分: ADS层: 应用服务层 DWS层:数仓汇总层 DWD层:数仓明细层 ODS层 ...

最新文章

  1. 马斯克发推警告:高级AI将操纵社交媒体,或引发第三次世界大战
  2. 【BLE】TLSR8258开发记录之9--IIC驱动TMP102
  3. 【Matlab】绘制不同颜色线条
  4. centos安装mysql8.0.13_CentOS 7.4安装MySql 8.0.13及配置
  5. Nginx之二:nginx.conf简单配置(参数详解)
  6. 请假案例_师生沟通案例8|谢谢你,“请假大王”!
  7. bzoj 2302: [HAOI2011]Problem c(DP)
  8. paip.QQ音乐导出歌单总结
  9. python界面实现点餐系统_餐厅点餐系统详细设计与系统实现
  10. Jmeter测试脚本编写详解(配详图)
  11. Sophix介绍与实践
  12. 微型计算机原理中的mov,微机原理(判断题)(指令正误)
  13. uniapp打开外部链接
  14. 解决 array subscript has type char 错误
  15. python 爬漫画 小白学习过程
  16. 如何注册wish买家账号?
  17. 【数据结构 严蔚敏版】 二叉树 基本操作
  18. 编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音,可以弹奏的乐器包括二胡、钢琴和琵琶。
  19. spring 1.0-5.0版本注解发展史(一)
  20. shell脚本配置运行python程序,小技巧之 Linux 软连接的使用

热门文章

  1. (12)ObjectARX2015 + vs2012创建尺寸标注
  2. node.js+uni计算机毕设项目儿童健康成长档案小程序(程序+小程序+LW)
  3. Hive 的 SerDe 是什么?
  4. 数论常用内容——中国剩余定理
  5. php大数相乘,简单的大数相乘算法
  6. ByteBuf 笔记
  7. python3中urlopen_详解python3 urllib中urlopen报错的解决方法
  8. python无法调用urlopen_python3 urllib中urlopen报错的问题解决办法
  9. Oracle:ORA-00911: 无效字符
  10. 魔众网盘系统 v1.3.0 后台菜单快捷搜索 修复已知问题