0. 需求

 我们有如下的用户访问数据userId  visitDate   visitCountu01     2017/1/21        5u02     2017/1/23        6u03     2017/1/22        8u04     2017/1/20        3u01     2017/1/23        6u01     2017/2/21        8U02     2017/1/23        6U01     2017/2/22        4要求使用SQL统计出每个用户的累积访问次数,如下表所示:用户id    月份    小计  累积u01     2017-01  11    11u01     2017-02  12    23u02     2017-01  12    12u03     2017-01  8     8u04     2017-01  3     3

1.实现

窗口函数典型案例

      (1) 数据准备

u01    2017/1/21    5
u02    2017/1/23    6
u03    2017/1/22    8
u04    2017/1/20    3
u01    2017/1/23    6
u01    2017/2/21    8
u02    2017/1/23    6
u01    2017/2/22    4 

    (2)创建hive表

CREATE TABLE dan_test.sqltest1 ( userId string, visitDate string,visitCount string )
ROW format delimited FIELDS TERMINATED BY "\t";load data local inpath "/home/centos/dan_test/sqltest1.txt" into table sqltest1;

  (3)需求实现

     ① 将时间进行格式化,转换成题目要求的时间

采用date_format函数+regexp_replace函数

select date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') from sqltest1hive> select date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') from sqltest1;
OK
2017-01
2017-01
2017-01
2017-01
2017-01
2017-02
2017-01
2017-02
Time taken: 0.15 seconds, Fetched: 8 row(s)

    转换日期作为子表

SELECT userid,date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') AS visitmonth,visitcount
FROM sqltest1

  ② 分析函数+窗口函数实现

注意求用户每月汇总额的时候注意去重,如不去重则是如下结果。为什么需要去重?因为窗口函数作用的是每条记录,在每条记录的后面都会形成结果,其分析函数,分析的范围是over()函数中所指定的,这一点一定要弄明白

select t.userid as userid  ,t.visitmonth as visitmonth,sum(t.visitcount) over(partition BY userid,visitmonth) as sum_per_monthfrom(SELECT userid,date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') AS visitmonth,visitcountFROM sqltest1)t

     本题最终的结果如下:

select s.userid,s.visitmonth,s.sum_per_month,sum(s.sum_per_month) over(partition BY s.userid order by s.visitmonth) as total_visitcount
from
(select distinct t.userid as userid  ,t.visitmonth as visitmonth,sum(t.visitcount) over(partition BY userid,visitmonth) as sum_per_monthfrom(SELECT userid,date_format(regexp_replace(visitdate,'/','-'),'yyyy-MM') AS visitmonth,visitcountFROM sqltest1)t
)s

2 小 结

   本题主要的使用知识点归纳如下:

  •   (1)regexp_replace函数的使用
  • (2)date_format函数的使用
  • (3)窗口函数与分析函数的结合使用。当然本题也可以不用窗口函数分析,也可以使用group by完成,读者自行尝试

SQL之累积计算问题--HQL面试题1相关推荐

  1. PGSQL-通过SQL语句来计算两个日期相差的天数

     转自:https://www.cnblogs.com/chenglang/p/9843932.html 这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用 ...

  2. SQL语句中计算百分比

    SQL语句中计算百分比  A.TOTAL_COUNT TOTALCOUNT,    A..QUES_COUNT  QUESCOUNT,    CASE WHEN TOTAL_COUNT = QUES_ ...

  3. SQL根据出生日期计算年龄的两种算法

    --Sql根据出生日期计算年龄 1.  select datediff(year,EMP_BIRTHDAY,getdate()) as '年龄' from  EMPLOYEEUnChangeInfo ...

  4. Python中序列的累积计算

    [小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python中序列的累积计算 cumsum()函数 选择题 以下python代码输出什么? ...

  5. Excel 2010 SQL应用039 计算员工社会保险缴纳金额

    目录 源数据表 解决方案 按照百分比例计算字段 Excel中数字的精度 源数据表 姓名 工资 刘静茹 2882 何冬梅 2085 王清容 2477 程飞娥 3836 朱小林 3217 罗秀丽 3543 ...

  6. Pandas —— cum累积计算和rolling滚动计算

    Pandas主要统计特征函数: 方法名 函数功能 sum() 计算数据样本的总和(按列计算) mean() 计算数据样本的算术平均数 var() 计算数据样本的方差 std() 计算数据样本的标准差 ...

  7. oracle发票验证,通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录...

    我有一个SERVICE表,该表存储一个表中的服务数量,然后链接到连接到INVOICE的LINE表.通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录 我想要创建一个触发器,根据SER ...

  8. sql如何让计算出来的结果百分数显示_图解面试题:如何交换数据?

    [题目] 小明是一所学校的老师,她有一张 '学生表',平时用来存放座位号和学生的信息.其中,座位号是连续递增的.总的座位数是偶数. 现在,小明想改变相邻俩学生的座位.你能不能帮她写一个sql查来输出想 ...

  9. SQL之获取积分最多的人--HQL面试题37

    目录 0 问题描述 1 数据准备 2 数据分析 3 小结 0 问题描述 牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分. 有一个用户表(user),简况如下: 还有一个积分表(g ...

最新文章

  1. Qt设计器中,使用QToolBar控件的技巧
  2. 每个人都应有自己的作品
  3. JavaSE——Java8之Stream流
  4. 分区表修复工具--DISKFIX
  5. Python爬虫——查询英语四、六级成绩
  6. python心率检测
  7. DRM DUMB相关说明
  8. excel生成动态进度条
  9. 设计原则与模式009 中介者模式
  10. Navicat Premium的下载及安装
  11. CommonAPI使用例子-HelloWorld
  12. 兄dei,帮我开一下门吧~
  13. Who Wants to Be a Millionaire?
  14. android studio开发整合资源简单实现android扫一扫功能
  15. flutter 记录 问题
  16. STM32MP157驱动开发——4G通信模块驱动
  17. flash读取xml简明实例教程
  18. 爱了,爱了,一款拯救直男的开源神器!
  19. spring task定时任务(个人笔记,非教程)
  20. linux中who命令显示的pts/0和(:0)(:0.0)是什么意思?

热门文章

  1. 如何去除图片上的文字(PS使用教程)
  2. python eel_python eel打包问题解决
  3. OpenStack腾讯云部署_Nova部署
  4. Android S关闭定位开关后,定位权限被AppOps限制。
  5. 《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销
  6. 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.3 开始新游戏
  7. 任务卡_05-数据库_数据库基础
  8. LabVIEW如何减少下一代测试系统中的硬件过时6
  9. ubuntu18安装详细教程
  10. java注解约束参数为固定值_java自定义注解的实现及属性设置