SQL之累积计算问题--HQL面试题1
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相关推荐
- PGSQL-通过SQL语句来计算两个日期相差的天数
转自:https://www.cnblogs.com/chenglang/p/9843932.html 这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用 ...
- SQL语句中计算百分比
SQL语句中计算百分比 A.TOTAL_COUNT TOTALCOUNT, A..QUES_COUNT QUESCOUNT, CASE WHEN TOTAL_COUNT = QUES_ ...
- SQL根据出生日期计算年龄的两种算法
--Sql根据出生日期计算年龄 1. select datediff(year,EMP_BIRTHDAY,getdate()) as '年龄' from EMPLOYEEUnChangeInfo ...
- Python中序列的累积计算
[小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python中序列的累积计算 cumsum()函数 选择题 以下python代码输出什么? ...
- Excel 2010 SQL应用039 计算员工社会保险缴纳金额
目录 源数据表 解决方案 按照百分比例计算字段 Excel中数字的精度 源数据表 姓名 工资 刘静茹 2882 何冬梅 2085 王清容 2477 程飞娥 3836 朱小林 3217 罗秀丽 3543 ...
- Pandas —— cum累积计算和rolling滚动计算
Pandas主要统计特征函数: 方法名 函数功能 sum() 计算数据样本的总和(按列计算) mean() 计算数据样本的算术平均数 var() 计算数据样本的方差 std() 计算数据样本的标准差 ...
- oracle发票验证,通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录...
我有一个SERVICE表,该表存储一个表中的服务数量,然后链接到连接到INVOICE的LINE表.通过使用Oracle SQL脚本进行计算(总发票)的多个表的更新记录 我想要创建一个触发器,根据SER ...
- sql如何让计算出来的结果百分数显示_图解面试题:如何交换数据?
[题目] 小明是一所学校的老师,她有一张 '学生表',平时用来存放座位号和学生的信息.其中,座位号是连续递增的.总的座位数是偶数. 现在,小明想改变相邻俩学生的座位.你能不能帮她写一个sql查来输出想 ...
- SQL之获取积分最多的人--HQL面试题37
目录 0 问题描述 1 数据准备 2 数据分析 3 小结 0 问题描述 牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分. 有一个用户表(user),简况如下: 还有一个积分表(g ...
最新文章
- Qt设计器中,使用QToolBar控件的技巧
- 每个人都应有自己的作品
- JavaSE——Java8之Stream流
- 分区表修复工具--DISKFIX
- Python爬虫——查询英语四、六级成绩
- python心率检测
- DRM DUMB相关说明
- excel生成动态进度条
- 设计原则与模式009 中介者模式
- Navicat Premium的下载及安装
- CommonAPI使用例子-HelloWorld
- 兄dei,帮我开一下门吧~
- Who Wants to Be a Millionaire?
- android studio开发整合资源简单实现android扫一扫功能
- flutter 记录 问题
- STM32MP157驱动开发——4G通信模块驱动
- flash读取xml简明实例教程
- 爱了,爱了,一款拯救直男的开源神器!
- spring task定时任务(个人笔记,非教程)
- linux中who命令显示的pts/0和(:0)(:0.0)是什么意思?
热门文章
- 如何去除图片上的文字(PS使用教程)
- python eel_python eel打包问题解决
- OpenStack腾讯云部署_Nova部署
- Android S关闭定位开关后,定位权限被AppOps限制。
- 《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销
- 《MINECRAFT我的世界 新手完全攻略(第3版)》一1.3 开始新游戏
- 任务卡_05-数据库_数据库基础
- LabVIEW如何减少下一代测试系统中的硬件过时6
- ubuntu18安装详细教程
- java注解约束参数为固定值_java自定义注解的实现及属性设置