IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL 求解连续问题(相邻问题) -> 正文阅读

[大数据]SQL 求解连续问题(相邻问题)

拼多多面试题:如何找出连续出现N次的内容?

视频这么火,你会这么分析吗? - 知乎

一个select中不能写两个开窗函数

在一个select中开窗函数的结果不能作为筛选条件

表名:user_online_record

字段名:user_id,online_date

用到的函数

窗口函数 row_number,lead,lag
日期函数 month,date_sub
特殊函数 coalesce

1.每个月每个用户的每个日期的登陆顺序

select *,
month(online_date) as 月,
row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序 
from user_online_record

?2.每个月每个用户的每个日期的下一次登陆日期

select *,
month(online_date) as 月,
lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date), user_id order by online_date) as 当月下一次登陆日期 
from user_online_record

?2.1带上登陆顺序

select *,
lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date), user_id order by online_date) as 当月下一次登陆日期
from (
    select *,month(online_date) as 月,
    row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序
    from user_online_record
) as t1

?2.2.筛选出中止登陆的日期

select * from(
    select *,lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date),                 user_id order by online_date) as 当月下一次登陆日期
        from (
            select *,month(online_date) as 月,row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序
            from user_online_record
            ) as t1
            ) as t2
where date_sub(当月下一次登陆日期,interval 1 day) <> online_date or 当月下一次登陆日期='当月最后登陆日期';

?3.上次登陆日期的登陆顺序

select *,
lag(每个月每个日期的登陆顺序,1)  over (partition by month(online_date),user_id order by '每个月每个日期的登陆顺序') as '上次登陆顺序'
 from(
    select *,lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date),     user_id order by online_date) as 当月下一次登陆日期
    from (
        select *,month(online_date) as 月,row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序
        from user_online_record
         ) as t1
    ) as t2
where date_sub(当月下一次登陆日期,interval 1 day) <> online_date or 当月下一次登陆日期='当月最后登陆日期';

4.最后一次登陆日期的登陆顺序减去最后一次的前一次的登陆日期的登陆顺序即为连续登陆的天数?

select *,
每个月每个日期的登陆顺序-coalesce(lag(每个月每个日期的登陆顺序,1)  over (partition by month(online_date),user_id order by '每个月每个日期的登陆顺序'),0) as '连续登陆天数'
 from(
    select *,lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date), user_id order by online_date) as 当月下一次登陆日期
    from (
        select *,month(online_date) as 月,row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序
        from user_online_record
        ) as t1
    ) as t2
where date_sub(当月下一次登陆日期,interval 1 day) <> online_date or 当月下一次登陆日期='当月最后登陆日期';

?5.再套一层,以连续登陆天数为条件删选

select distinct 月,user_id
from (
    select *,
每个月每个日期的登陆顺序-coalesce(lag(每个月每个日期的登陆顺序,1)  over (partition by month(online_date),user_id order by '每个月每个日期的登陆顺序'),0) as '连续登陆天数'
     from(
        select *,lead(online_date,1,'当月最后登陆日期') over (partition by month(online_date), user_id order by online_date) as 当月下一次登陆日期
        from (
            select *,month(online_date) as 月,row_number() over (partition by month(online_date), user_id order by online_date) as 每个月每个日期的登陆顺序
            from user_online_record
            ) as t1
        ) as t2
where date_sub(当月下一次登陆日期,interval 1 day) <> online_date or 当月下一次登陆日期='当月最后登陆日期'
    ) as t3 where 连续登陆天数>=2;

综上:每个月连续登陆超过2天的用户

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:36:19  更:2022-03-12 17:38:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:06:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码