所谓的数据稠化,就是补全缺失的数据。因为在数据库表中,存储的数据经常是稀疏的(sparse data),也就是不完整的。比如记录一个员工每个月的销售额,用这么一个销售表来记录:SalesRecord(Name(姓名),Date(日期),Sales(销售额)),假设某个月这个员工请假没上班,对应的没有销售额,一般也不会将这个员工的销售额存储为0,而是直接不存储,这样在销售表中就会产生缺失的行,导致的结果就是这些销售数据在时间上是不连续的,或者说就是缺失的。为了后续的一些统计,需要对数据进行补全也就是所谓的数据稠化。

下面做一个简单的例子,

图 1

需要知道每个人每科的成绩,这里就是需要补全数据,比如(Lucy的Chinese成绩??),因此,最终我们需要的到

的结果是这样的(红色背景是补全的内容):

图 2

步骤如下:

先创建一张成绩表Scores

1 --创建Scores表

2 create tableScores(3 stuName varchar2(10),4 subject varchar2(10),5 score number );

然后插入数据,得到图1.

接下来,我们是实现一维(学科)数据稠密,也就是对学科,每个人都有每个学科,首先想到的是要找出所有学科(暂且这么做,以后经常是对另外一张学科表join),

废话少说,找出所有学科:

select distinct subject from Scores;

我们可以根据原表利用partition by()语法来进行下一步操作

1 --一维稠密数据

2 SELECTscores.stuname,3 m.subject,4 NVL(scores.score,0)5 FROMscores6 PARTITION BY(scores.stuname) --这里是重点7 right join

8 (SELECT DISTINCT subject FROMscores) m9 ON scores.subject=m.subject;

最终得到结果:

显然,上面的代码看起来很杂乱,我们可以来个with as 语法,使代码看起来清晰:

withv1as (select distinct subject fromscores),SELECT scores.stuname,v1.subject,NVL(scores.score,0) FROMscores

PARTITIONBY(scores.stuname)right joinv1ON scores.subject=v1.subject;

实现了一维的数据稠密,那么给表再添加个字段—年份,需要知道每个人,每年的每科成绩又怎么稠密呢?同样的道理

先实现一维的稠化,再在稠化后的基础上再稠化一次,以此类推就可以了嘛!

withv1as (select * fromscores), --这是原表

v2as (select distinct subject fromscores), --所有科目

v3as (select distinct dateyear fromscores), --所有年份

v4as (select v1.stuname,v2.subject,v1.score,v1.dateyear fromv1

partitionby(v1.stuname)right joinv2on v1.subject =v2.subject) --v4就是对学科稠密化后的表,如图2所示select v4.stuname , v4.subject , NVL(v4.score,0),v3.dateyear fromv4

partitionby(stuname,subject) --注意这里right joinv3 --最后在对v4进行年份的稠密,on v4.dateyear=v3.dateyear;

这样就大功告成啦,每个人,每年的每课成绩均可有了。接下来,需要对着表进行行列转换如下图所示,这里我们以后再说!

下面实现二维数据稠化,我们同样有如下表:

YEARMONTH

STUDENT

SUBJECT

SCORE

201601

Jim

Chinese

78

201601

Jim

Math

34

201603

Jim

English

89

201605

Jim

Physics

88

201608

Jim

Math

67

201601

Joe

Math

87

201602

Joe

Chinese

87

201604

Joe

Chinese

55

201609

Joe

Math

45

201609

Joe

Physics

90

YEARMONTH

STUDENT

SUBJECT

SCORE

201601

Jim

Chinese

78

201601

Jim

Math

34

201601

Jim

English

0

201601

Jim

Physics

0

201602

Jim

Chinese

0

201602

Jim

Math

0

201602

Jim

English

0

201602

Jim

Physic

0

201603

Jim

Chinese

0

201603

Jim

Math

0

201603

Jim

English

89

201603

Jim

Physics

0

如右表所示,部分补全数据为红色背景的数据,其分数默认为0,这样我们就能看到

每个人(student维度)在所有时间(yearmonth维度)的每科(subject维度)的分数(score度量)

我们的做法应该是怎么样呢?

我们先做前期的准备,创建一张成绩表,并插入相应的数据

--创建学生成绩表

CREATE TABLEstu_score (

yearmonthnumber,

studentVARCHAR2(20),

subjectvarchar2(20),

scorenumber)--往表中插入数据

INSERT INTO stu_score VALUES(201601,'Jim','Chinese',78);INSERT INTO stu_score VALUES(201601,'Jim','Math',34);INSERT INTO stu_score VALUES(201603,'Jim','English',89);INSERT INTO stu_score VALUES(201605,'Jim','Physics',88);INSERT INTO stu_score VALUES(201608,'Jim','Math',67);INSERT INTO stu_score VALUES(201601,'Joe','Math',87);INSERT INTO stu_score VALUES(201602,'Joe','Chinese',87);INSERT INTO stu_score VALUES(201604,'Joe','Chinese',55);INSERT INTO stu_score VALUES(201609,'Joe','Math',45);INSERT INTO stu_score VALUES(201609,'Joe','Physics',90);

同样,创建一张时间维度表

--创建时间维度表

CREATE TABLEDIM_DATE (

yearmonthnumber);INSERT INTO DIM_DATE VALUES(201601);INSERT INTO DIM_DATE VALUES(201602);INSERT INTO DIM_DATE VALUES(201603);INSERT INTO DIM_DATE VALUES(201604);INSERT INTO DIM_DATE VALUES(201605);INSERT INTO DIM_DATE VALUES(201606);INSERT INTO DIM_DATE VALUES(201607);INSERT INTO DIM_DATE VALUES(201608);INSERT INTO DIM_DATE VALUES(201609);INSERT INTO DIM_DATE VALUES(201610);INSERT INTO DIM_DATE VALUES(201611);INSERT INTO DIM_DATE VALUES(201612);

然后,我们需要做的就是去稠化这些数据,保证在每个维度都有数据

WITH sub AS(SELECT DISTINCT subject FROMstu_score

),

t1as(SELECT t.yearmonth,t.student,sub.subject,t.score FROMstu_score t

PARTITIONBY (t.student) RIGHT JOINsubON t.subject=sub.subject)SELECT dim_date.yearmonth,t1.student,t1.subject,nvl(t1.score,0) FROMt1

PARTITIONBY(student,subject)right JOIN DIM_DATE ON dim_date.yearmonth = t1.yearmonth;

或者,不用创建临时表,直接合并

WITH sub AS ( --学科维度表,将所有学科选出

SELECT DISTINCT subject FROMstu_score

),SELECT dim_date.yearmonth,t1.student,t1.subject,nvl(t1.score,0) FROM(SELECT t.yearmonth,t.student,sub.subject,t.score FROMstu_score t

PARTITIONBY (t.student) RIGHT JOINsubON t.subject=sub.subject)t1 --对学科稠化,每个人在每个学科都有数据

PARTITION BY(student,subject)right JOIN DIM_DATE ON dim_date.yearmonth = t1.yearmonth; --对日期稠化,保证每个日期都有数据

mysql稠化报表_Oracle使用PARTITION BY 实现数据稠化报表相关推荐

  1. 数据可视化模板_10分钟,做一份数据可视化分析报表

    做一份涵盖内容多.涉及数据量大的数据可视化分析报表要多久?10分钟够吗?如果奥威BI系列的分析软件会说话,恐怕要吐槽10分钟太多,5分钟足够.不说别的,论做智能数据可视化分析报表的效率,奥威BI系列软 ...

  2. MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?

    数据库服务于企业的核心交易业务和实时交互应用,承载着企业的核心数据,因此企业对于数据库的数据一致性和高可用性有强烈的需求. 本次内容为青云QingCloud 数据库工程师蒙哲在 3306Pai 201 ...

  3. mysql exporter怎么配置_mysqld_exporter的源码分析和定制化(单个mysqld_exporter监控多个数据库实例)...

    mysqld_exporter是prometheus官方提供的用于监控mysql运行状态的exporter.其相关信息可以参考:https://github.com/prometheus/mysqld ...

  4. 报表数据业务化,让业务部门的领导一看就清清楚楚

    BI目前被很多公司神话了,总让人感觉是高大上,看过很多企业BI产品,发现几个特点: 现在大都是多屏.交互的形式了,随时随地可以数据化. 以IT主导设计的BI产品,优点是体验感不错,缺点是又臭又长没有重 ...

  5. 史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)

    前言 这个从上至下都在强调数字化转型的时代,越来越多公司重视数据,也越来越多的企业有数据建设的需求. 企业无论做任何数据工作,必然要有一定的信息化基础,也要有数据化建设的基础,少不了数据平台.数据应用 ...

  6. 帆软报表在已经搭载服务器上开发_史上最全企业数据产品选型对比(含数仓、报表、BI、中台、数据治理)...

    前言 这个从上至下都在强调数字化转型的时代,越来越多公司重视数据,也越来越多的企业有数据建设的需求. 企业无论做任何数据工作,必然要有一定的信息化基础,也要有数据化建设的基础,少不了数据平台.数据应用 ...

  7. 十大报表工具 BI 产品深度点评-----BI报表行业专家干货分享----一文读懂报表与BI的行业现状----最新常用BI报表工具对比科普帖

    目前国内市场上的报表 BI 工具琳琅满目,看起来也各有特点,这给选型工作带来了一些困扰,本文就一些较活跃的报表 BI 产品进行点评,对于不太熟悉这些产品和技术的同学,可作为参考资料. 这里选了十个产品 ...

  8. 选开源报表还是商用?2018最新试用三款报表软件产品的感受

    本文非本人整理,仅为搬运工!!! 转载自原文:https://blog.csdn.net/qq_41456848/article/details/83744388,仅供参考. 原文如下: 头疼啊  头 ...

  9. 你的报表工具会做数据准备吗 ——报表开发中的深层次问题

    前言 现在企业的报表开发大部分都使用报表工具完成,成熟的报表工具提供了丰富的显示设置.图表类型.导出打印等功能可以简化报表开发,非常方便.但在实际报表开发中还是经常碰到一些非常棘手的深层次问题,即使是 ...

最新文章

  1. 数学,对人工智能开发者意味着什么
  2. sqlserⅴer随机函数_SQL server 随机数函数
  3. MyEclipse中的web项目之前有个感叹号
  4. bash 的进站欢迎提示
  5. web.xml中相关标签的加载顺序
  6. (11) nginx + keepalived 双机热备
  7. suse 安装oracle11,Suse11安装Oracle11gR2
  8. java task和thread_【Java学习笔记-并发编程】线程与任务
  9. Security+ 学习笔记39 安全网络设计
  10. 点云能量预测:KPConv点云输入方式
  11. Atitit 编程语言知识点tech tree v2 attilax大总结
  12. 从30天到17小时,如何让HSPICE仿真效率提升42倍?
  13. erp系统包括哪些模块
  14. 32位程序使用超过4G的内存
  15. R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用attributes函数查看线性回归模型的属性信息、获取模型拟合对应的残差值residuals
  16. android 4.4 蓝牙开发总结(电视盒子)
  17. 微会动创始人袁帅:什么是二维码会议服务?
  18. 苹果笔记本显卡性能测试软件,测试结果来了!新款Macbook Pro显卡性能怎样?
  19. nginx服务器缓存文件清理,清除nginx缓存文件并不总是有效
  20. 干货 I 用数据分析进行“无死角”的复盘?

热门文章

  1. CSDN写博客提交后的网络交互
  2. SAP IBASE hierarchy remove - step2 handling
  3. jQuery plugin 开发的一个例子
  4. 如何处理SAP OData错误消息: Invalid parametertype used at function XXXX
  5. 利用微信登录掘金网站的HTTP请求分析
  6. adb: createprocessw failed: 系统找不到指定的路径_gcc编译过程、gcc命令参数、静态库和动态库搜索路径...
  7. 恒生电子实施怎么样_蓝思科技今年来涨幅超166%,消费电子主题基金如何挑选?...
  8. 思科网络基础课件_上海思科CCNA培训、思科网络工程师培训
  9. 两数之和Python解法
  10. 弗吉尼亚理工计算机科学排名,2020年弗吉尼亚理工大学排名TFE Times美国最佳计算机科学硕士专业排名第45...