前一天数据偏移至当日数据

简介: 客户画像项目中可能会遇到此类问题,因为客户画像要求的是对单个用户信息的查询。 但倘若以日周期为准,今日梳理的数据宽表中某个字段为null,但此类字段不能以null显示,要以前一天有数据的值为今日的值,就需要做case when处理。

客户画像项目中可能会遇到此类问题,因为客户画像要求的是对单个用户信息的查询。 但倘若以日周期为准,今日梳理的数据宽表中某个字段为null,但此类字段不能以null显示,要以前一天有数据的值为今日的值,就需要做case when处理。 同时还有个问题,日表拥有某些客户信息(以日更新),但并不是用户全量表,而月表为用户全量表(拥有历史月的所有用户数),日表可能会增加也可能会减少数据。这样 不管你left join谁 都无法得到全量的用户数据。 使用以下方法便可实现:

方法1:

FULL OUTER JOIN 关键字返回左表(Customers)和右表(Orders)中所有的行。如果 "table1" 表中的行没有匹配或者 "table2" 表中的行在 "table1" 表中没有匹配,也会列出这些行。

 select case when a.product_no is null then b.product_no else a.product_no end product_no,a.l2_01_01_04,b.l2_01_01_04_05 from table1 a full outer join table2 b on a.product_no = b.product_no;
使用full outer join 并对客户的信息字段进行 case when 为空判断,如果为空则取前一天的表中数据.
 
方法2:
日表和月表中都有同一个product_no字段,那么可以首先union一下product_no,然后 创建只有product_no的中间表(有重复可以distinct或者group by一下)
create table table3 as select product_no from (select product_no from table1 union all select product_no from table2) a group by product_no;
 
随后用此中间表left join 日表 left join 月表 便可得到全量的用户数据了~
select tmpTable.product_no,t_3000.l2_01_01_04,t_3842.L1_01_02_01 from tmpTable  left join mongodb_201406 t_3000 on tmpTable.product_no = t_3000.product_no  left join DW_COCLBL_M01_201406 t_3842 on tmpTable.product_no = t_3842.product_no  ) a
 
随后呢~ 再为此表创建带自增列的最终表,方便后续份页读取数据并进行数据转换~代码如下:(用代码拼sql很痛苦,因为牵扯到别名问题呀~)
 1 StringBuffer createTmpTable = new StringBuffer();
 2                 StringBuffer tmpUnionSelect = new StringBuffer();
 3                 StringBuffer tmpTableFrom = new StringBuffer();
 4                 for(int i=0;i<ColumnNames.size();i++){
 5                     SiCustomerLabelInfoModel Column = ColumnNames.get(i);
 6                     List<CiMdaSysTableModel> ciMdaSysTable = ciCustomerJDao.getMdaSysTableName(Column.getColumnName());
 7                     String alias = "t_" + ciMdaSysTable.get(0).getTableId();
 8                     String aliasColumn = alias + "." + Column.getColumnName();
 9                     if(ciMdaSysTable.get(0).getUpdateCycle() == 1){
10                         aliasTable = ciMdaSysTable.get(0).getTableName() +"_"+ dayDate + " " + alias;
11                     }else{
12                         aliasTable = ciMdaSysTable.get(0).getTableName() + "_" + monthDate + " "+ alias;
13                     }
14                     if(ciMdaSysTable.get(0).getUpdateCycle() == 2){
15                         mainTable = aliasTable;
16                     }
17                     ColumnNameList.add(aliasColumn);
18                     tableNameList.add(aliasTable);
19                 }
20                 tmpUnionSelect.append("select ").append(mainColumn).append(" from (").append(" select ").append(mainColumn).append(" from ").append(mainTable);
21                 selectResult.append("select ").append("tmpTable.").append(mainColumn);
22                 fromTableName.append(" from tmpTable ");
23                 Iterator<String> table = tableNameList.iterator();
24                 while(table.hasNext()){
25                     String tableName = table.next();
26                     String[] tableAlias = tableName.split(" ");
27                     String alias = tableAlias[1];
28                     
29                     if(!mainTable.equals(tableName)){
30                         tmpTableFrom.append("union all select ").append(mainColumn).append(" from ").append(tableName).append(") a")
31                         .append(" group by ").append(mainColumn);
32                     }
33                     fromTableName.append(" left join ").append(tableName).append(" on ").append("tmpTable").append(".").append(mainColumn)
34                     .append(" = ").append(alias).append(".").append(mainColumn).append(" ");
35                 }
36                 Iterator<String> column = ColumnNameList.iterator();
37                 while(column.hasNext()){
38                     String columnName = column.next();
39                     selectResult.append(",").append(columnName);
40                 }
41                 fromTableName.append(" ) a ");
42                 selectResult.append(fromTableName);
43 
44                 createTmpTable.append("create table").append(" tmpTable ").append("as ")
45                 .append(tmpUnionSelect).append(" ").append(tmpTableFrom);
46                 ciCustomerJDao.executeInBackDataBase(createTmpTable.toString());
47                 
48                 Createtable.append("create table ").append(newTableName).append(" as SELECT ROW_NUMBER() OVER() as id,* from").append(" (").append(selectResult);
49                 ciCustomerJDao.executeInBackDataBase(Createtable.toString());

 

随后再用此表与前一个日周期生成的表进行case when就OK了。。。有人会想,效率会不会很低呢~ 其实我也在想,但后台为spark集群,应该不会有问题~有问题再调整参数好了~

这里还牵扯到一个问题,就是如果日表的字段更新了,那么最后一步跟前一个日周期的表进行case when不是会报错吗,会报没有那个字段的。 是呀~ 后续要把前一天的字段信息存入mongodb,每次case when时先查出来这些字段信息(前一天的) 然后与今日的的字段进行对比 筛选出共同的,用来拼case when 其他的在生成表的时候直接创建就好。 

 

反正好麻烦啊~ 好痛苦啊~好虐好爽啊~有更好的方法还有待学习呀~

目录
相关文章
|
iOS开发 MacOS Windows
Axure快速入门(03) - 丰富的元件库
Axure快速入门(03) - 丰富的元件库
1614 0
Axure快速入门(03) - 丰富的元件库
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
176 2
|
数据处理 计算机视觉 芯片
【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】
【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】
572 2
|
安全 Windows
.iso文件怎么打开?
在日常使用电脑的过程中,很多用户都会遇到.iso文件,尤其是在安装软件、操作系统或者备份光盘内容时。那么,什么是.iso文件?该如何打开它?本文将为大家详细解答这些问题,帮助大家轻松处理.iso文件。
.iso文件怎么打开?
|
人工智能 安全 API
API应用安全风险倍增,F5助企业赢得关键安全挑战
API应用安全风险倍增,F5助企业赢得关键安全挑战
170 11
|
设计模式 Python
Python教程:一文了解Python工厂模式
工厂模式是一种创建型设计模式,它用于创建对象的实例,而无需在客户端代码中指定具体的类。通过引入工厂类,客户端代码只需要与工厂接口进行交互,而不需要了解实际创建的对象的细节。这样可以将对象的创建和使用分离开来,提高了代码的灵活性和可维护性。
201 2
|
XML Android开发 数据格式
Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)
Android App开发实战项目之大头贴App功能实现(附源码和演示 简单易上手)
357 0
|
DataWorks Java 数据库连接
DataWorks操作报错合集之dataworks 离线同步任务 出现 “实时生成的过期实例” 如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
189 0
|
Rust 前端开发 JavaScript
前端技术发展趋势与应用前景分析
【2月更文挑战第8天】 随着互联网时代的不断发展,前端技术作为网页和移动端开发的核心领域,也在不断演进。本文将深入探讨前端技术的发展趋势与应用前景,分析当前热门技术及其在各行业中的应用,帮助读者更好地了解前端技术的现状与未来。
|
NoSQL Java 数据管理
Nacos开发手册
Nacos开发手册
774 0
Nacos开发手册