昨天群上有人发个阿里的面试题,题目描述大概如下:

数据源:用户登录表,只有俩个字段,uid和dt

试用HQL抽取出连续登录了K天的用户uid

第一个想法就是直接用一个UDF解决,按uid分组,把dt收集起来然后在UDF里面判断是否满足条件

SELECT
uid,
isExist(collect_set(dt), k) flag
FROM
table_name
GROUP BY
uid
HAVING
flag = 1;

其中isExist的逻辑是判断collect_set中是否存在k个连续的值

这种方法简单明了,但是需要额外的写一个UDF,对于不懂JAVA的来说确实比较麻烦

今天群里有个神人给出了一种新的解决思路,十分完美的解决了,下面是具体代码

SELECT
uid, MAX(dt) - MIN(dt) diff, COLLECT_set (dt)
FROM
(SELECT
a.uid, a.dt, dt - rn num
FROM
(SELECT
uid, dt, row_number () over (PARTITION BY uid
ORDER BY dt) rn
FROM
table_name
GROUP BY uid, dt) a) a
GROUP BY uid, num

该思路首先利用窗口函数以uid分组然后按照dt排序给出每个dt在排序中的位置,然后用求出dt与位置的差(记为num)

最后按照uid和num做一个聚合,容易发现同一个num组内的dt是连续的值

然后直接计数(count(*))就可以得出结果了

上面的代码只是为了更加方便看到输出的结果正确性,输出结果如下:

UID        DIFF    DT_ARRAY
1043736 3.0 {20140815 20140814 20140813 20140812}
1043736 0.0 {20140818}
1043736 1.0 {20140821 20140820}
1043844 0.0 {20140814}
1044090 1.0 {20140812 20140811}
1044090 2.0 {20140816 20140815 20140817}
1044090 0.0 {20140821}
1044264 0.0 {20140810}
1044264 3.0 {20140815 20140814 20140813 20140812}
1044264 5.0 {20140821 20140820 20140822 20140819 20140817 20140818}

结果中uid = 1043736 的一共登录了7天,其中可以拆分成三个连续的登录模块,分别是连续登录1天、2天和4天

    

Hive中抽取连续多天登录用户的更多相关文章

  1. 在SQL Server 2008 中使用SQL脚本创建登录用户并授权

    到处都使用超级用户sa显然是不安全的,因此有创建用户并让其只能访问某个数据库的必要.当然可以使用SQL Server自带的图形界面向导,但是太难用用了!有时候代码比较直接,比如这里: --使用已经创建 ...

  2. Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制

    1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...

  3. Rails中在model中获取当前登录用户

    应用场景:更新系统操作记录时,记录操作人即当前登录用户 方法一:在线程中添加一个变量 class UsersController < ApplicationController before_a ...

  4. newgrp---将当前登录用户临时加入到已有的组中

    Linux中的newgrp命令主要是将当前登录用户临时加入到已有的组中,用法如下: [linuxidc@localhost etc]$ newgrp grptest 上面命令的含义是将用户linuxi ...

  5. ASP.NET Core 集成测试中模拟登录用户的一种姿势

    不管哪种用户验证方式,最终都是在验证成功后设置 HttpContext.User ,后续处理环节通过 HttpContext.User 获取用户信息.如果能直接修改 HttpContext.User ...

  6. (4.25)Sqlserver中 登录用户只能看到自己拥有权限的库

    Sqlserver中 登录用户只能看到自己拥有权限的库 转自:https://www.cnblogs.com/huangtailang/p/4209180.html 相关参考:https://www. ...

  7. oracle查询连续n天登录的用户

    -- 查询连续3天登录的用户 1 先创建一个表,如下: create table USER_DATA ( USER_ID NUMBER, LOGIN_TIME DATE ); 2 插入用户登录数据: ...

  8. springboot+mybatis+shiro项目中使用shiro实现登录用户的权限验证。权限表、角色表、用户表。从不同的表中收集用户的权限、

    要实现的目的:根据登录用户.查询出当前用户具有的所有权限.然后登录系统后.根据查询到的权限信息进行不同的操作. 以下的代码是在搭好的框架之下进行的编码. 文章目录 核心实现部分. 第一种是将用户表和角 ...

  9. Sqlserver中 登录用户只能看到自己拥有权限的库

    执行之前新建用户时不要赋予任何权限 USE master GO --将所有数据库的查看权限给Public角色,每个登录用户只能查看指定的数据库 --此语句会导致服务器上所有的用户在没有设置数据库权限的 ...

随机推荐

  1. 运营商网络採用SDN所面临的挑战(一)

    运营商网络採用SDN所面临的挑战(一) Babak Samimi 将数据平面.控制平面与管理平面分隔开来所实现的软件定义网络(SDN)改善了OPEX及CAPEX,而且使得网络资源的集中调配和管理成为可 ...

  2. awk学习总结(两) How awk works and awk CMD in a file

    测试文件names Tom Savage 100 Molly Lee 200 John Doe 300 $0 代表file的整行; $1,第一列;$2,第二列...... $ awk '/Tom/{p ...

  3. Sky数 2097

    Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=2 ...

  4. Linux makefile 课程 非常具体的,和理解

    最近的一项研究Linux根据C计划,我买了一个电话<Linux环境C编程指南>阅读makefile这使他看起来困惑,我可能无法理解. 于是google到了下面这篇文章. 通俗易懂. 然后把 ...

  5. linux_vim_最佳快捷键

    如何使用vi文本编辑器     vi由比尔·乔伊(Bill Joy)撰写,所有UNIX like均默认安装此文本编辑器.详细简介请点击维基中文. 1.首先复制一个文件到/tmp目录(本例中为复制根目录 ...

  6. ASP.NET 5- 1

    ASP.NET 5 入门(1) - 建立和开发ASP.NET 5 项目   ASP.NET入门(1) - 建立和开发ASP.NET 5 项目 建立项目 首先,目前只有VS 2015支持开发最新的ASP ...

  7. iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释

    一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...

  8. sql事务,在sql2000里判断执行是否成功用@@ERROR 判断

    原文:sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 贴个sql事务,在sql2000里判断执行是否成功用@@ERROR 判断 这个东西多少还是有点问题,sql2005了可以用t ...

  9. Eclipse 引导阮卓项目 No projects are found to import解

    我们指示import当项目.由于一些git项目不.project和.classpath档.因此,直接import当然不是现有项目. 下面是解决方式: 1. new Android Project里面换 ...

  10. js调用wcf 的SOA

    jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来 经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传 ...