SQL学习日志——时间篇 6.26号上午补6.25号下午做的

因为是漫威迷,我学习SQL的轨迹也是先探索数据,发现数据之间的不同如何不同,空间,时间,用户生成分析,RFM分析,购物车分析,关联规则等。所以我将这些部分对应为六颗Infinity stones。每攻克一部分便好像拿到了一颗,等到我及其六颗,SQL水平就会上一个大的台阶,打个响指就有实习了(开玩笑)。


时间是缪奥数客户和业务的一个重要维度,本篇讨论日期和时间,并以此作为理解客户的工具。下面一篇将扩展讨论这个思想,引入生存分析,也称为由时间到事件的分析。

5.1数据库中的日期和时间

5.1.1在SQL中为了避开数据库对于时间的限制。将标准格式的日期转换为数字:



在Excel中,将结果(eg:20091013)自定义格式“0000-00-00”,看起来更像日期。

5.1.2转换为标准格式并用Excel折线图展示

这里的问题就是如何将monthday这一列转化为Excel可以识别的形式,这里用到下面的函数



如果A1=22.5,则公式“=FLOOR(A1,1)“ 结果就是22,22最接近1的倍数 
如果A1=22.5,则公式“=FLOOR(A1,3)“ 结果就是21,21最接近3的倍数
如果A1=25.8,则公式“=FLOOR(A1,3)“ 结果就是24,24最接近3的倍数
MOD() 取余。

关于图表的横轴标签的处理。Excel技巧


改为自定义 MMM,然后


简洁,好看。另外上图右侧的美元符号按照如下规则设置,也好看。


5.2开始调研日期

5.2.1确认一列中的日期是否还包含时间,即判断一列数据构成纯不纯。两个方法

CASE 和 CAST

一个是拆解时间的每一个部分判断,另外一个是去除日期部分看去除前后是否有差别。


5.2.2.根据日期比较计数(重要

先看一下原表


这是最简单的按照日期来分组



--1. 用运货日期(shipdate)和账单日期(billdate) 统计每天发货的数目以及生成账单数目

-- 为了简化步骤,将这两个查询合并。保留shipdate,如果这一天没有bill,numbill就null



BUT,存在一个问题:有些日期可能有账单,但是没有运货信息。当这种情况出现时,这些数据对应的日期在连接过程中丢失了。通过 FULL OUTER JOIN 解决。FULL OUTER JOIN 就是将两个表横向拼接到一起,根据ON的条件对应,没有对应上的为NULL。恰恰是因为存在很多的NULL,需要使用COALESCE()。就是取第一个非NULL值。

首先看下 FULL OUTER JOIN 将表合并成了什么样子:


结合COALESCE()函数之后,就很巧妙。有值就取,没有值就赋0。正好表示那一天没有运货或者订单量。



这又让我想到了第1章的时候用 UNION 然后赋值的 再 GROUP BY 。


初见这个查询的时候惊为天人,觉得SQL还能这又玩。等到现在我在自己的项目里面也用上了这样的思路,减少了在Excel里面里面操作的繁琐。这个查询可以用在全部的计数里面。


这里面我犯了一个错误,就是用了COUNT,你想想,用了COUNT之后不管是numship还是numbill。全部都一样,因为空值赋值0.应该用SUM。


--但是当某一天既没有运货记录,也没有账单记录时,输出就不包含这条记录。怎么办?
--我在做电视台的项目的时候也遇到了类似的问题。有些秒数没有记录,但是因为要做每一秒的累加,所以需要在Excel里面构造辅助列,结合Vlookup公式解决。但是在格式的匹配上面比较费事。


--用Calendar表解决




最终:


猜你喜欢

转载自blog.csdn.net/dufemt/article/details/80812890