hive sql 初阶

1.找出所有科目成绩都大于某一学科平均成绩的学生

表结构:uid,subject_id,score

select 
    uid
from(
    select 
        uid,
        if(score>avg_score,0,1) as flag
    from(
        select 
            uid,
            score,
            avg(score) over(partition by subject_id) as avg_score
        from 
            score 
        ) t1
    ) tt1
group by uid having sum(flag)=0

2.统计出每个用户按月的累积访问次数

表结构:uid,visit_date,visit_count

select 
    uid,
    mm,
    sum(mm_count) over(partition by uid order by mm) as sum_count
from(
    select 
        uid,
        mm,
        sum(visit_count) as mm_count
    from(
        select 
            uid,
            visit_count,
            date_format(regexp_replace(visit_date,'/','-'),'yyyy-MM') as mm 
        from 
            action
        ) t1
    group by uid,mm
    ) tt1 
group by uid,mm

3.连续问题

找出连续3天及以上减少碳排放量在100以上的用户

表结构:id,dt,lowcarbon

select 
    id,
    flag,
    count(1) as num 
from(
    select 
        id,
        dt,
        date_sub(dt,rk) as flag
    from(
        select 
            id,
            dt,
            row_number() over(partition by id order by dt) as rk
        from(
            select
                id,
                dt,
                sum(lowcarbon) as lowcarbon
            from 
                test 
            having lowcarbon>100
            ) t1 
        ) tt1
    ) ttt1 
group by id,flag 
having num>=3

4.分组问题(lag or lead)

某个用户连续的访问记录如果时间间隔小于60秒,则分为同一个组

表结构:id,ts

select 
    id,
    ts,
    sum(if(diff<60,1,0)) over(partition by id order by ts) as groupid
from(
    select 
        id,
        ts,
        last,
        ts-last as diff
    from(
        select 
            id,
            ts,
            lag(ts,1,0) over(partition by id order by ts) as last
        from 
            test 
        ) t1 
    ) tt1

5.间隔连续问题

计算每个用户最大的连续登录天数,可以间隔一天。解释:如果一个用户在1,3,5,6登录游戏,则视为连续6天登录

表结构: id,dt

select 
    id,
    max(diff) + 1 as days 
from(
    selet 
        id,
        flag,
        datediff(max(dt),min(dt)) as diff 
    from(
        select 
            id,
            dt,
            sum(if(flag<=2,0,1)) over(partition by id order by dt) as flag
        from(
            select 
                id,
                dt,
                datediff(dt,lag_dt) as flag
            from(
                select 
                    id,
                    dt,
                    lag(dt,1,'1970-01-01') over(partition by id order by dt) as lag_dt
                from 
                    test
                ) t1 
            ) tt1 
        ) ttt1 
    group by id,flag
    ) tttt1 
group by id

6.打折日期交叉问题

计算每个品牌总的打折销售天数,注意其中的交叉日期,

比如vivo品牌,第一次活动时间为2021-06-05到2021-06-15,
第二次活动时间为2021-06-09到2021-06-21其中9号到15号为重复天数,
只统计一次,即vivo总打折天数为2021-06-05到2021-06-21共计17天
表结构: id,start_dt,end_dt

select 
    id,
    sum(id(days>0,days+1,0)) as days 
from(
    select 
        id,
        datediff(end_dt,start_dt) as days
    from(
        select 
            id,
            if(maxEdt is null,start_dt,if(start_dt>maxEdt,start_dt,date_add(maxEdt,1))) as start_dt,
            end_dt
        from(
            select
                id,
                start_dt,
                end_dt,
                max(end_dt) over(partition by id order by start_dt rows between UNBOUNDED PRECEDING and 1 PRECEDING) as maxEdt
            from 
                test
            ) t1 
        ) t2
    ) t3 
group by id

7.同时在线人数

如下为某直播平台主播开播及关播时间,根据该数据计算出平台最高峰同时在线的主播人数

表结构:id,stt,edt

select 
    max(sum_p) as max_uv
from(
    select 
        id,
        dt,
        sum(p) over(order by dt) as sum_p
    from(
        select id,stt as dt,1 as p from test
        union all
        select id,edt as dt,-1 as p from test
        ) t1
    ) tt1

8.求每日新增用户的1,3,5,7日留存

select 
    first_dt,
    count(distinct user_id) as '新增用户数',
    round(count(distinct if(datediff(dt,first_dt)=1,user_id,null))/count(distinct user_id),2) as '次日留存率',
    round(count(distinct if(datediff(dt,first_dt)=3,user_id,null))/count(distinct user_id),2) as '3日留存率',
    round(count(distinct if(datediff(dt,first_dt)=5,user_id,null))/count(distinct user_id),2) as '5日留存率',
    round(count(distinct if(datediff(dt,first_dt)=7,user_id,null))/count(distinct user_id),2) as '7日留存率'
from(
    select 
        user_id,
        dt,
        first_dt 
    from 
        test t1
    left join(
            select 
                user_id,
                min(dt) as first_dt 
                from 
                    test 
                group by user_id
            ) t2
    on t1.user_id = t2.user_id
    ) t3 
group by first_dt

9.不用窗口函数求出每个部门消费排名前二的游戏

表结构: department game cash

-- 测试数据: 
a game1 100
a game2 100
a game3 200
a game4 400
b game1 300
b game2 300
b game3 200
b game4 300
-- 缺陷:如果cash相同,排名会相同
select 
    department,
    game,
    count(distinct b_cash) as rk  
from(
    select 
        a.department,
        a.game,
        a.cash as a_cash,
        b.cash as b_cash 
    from 
        game_cash a
    inner join 
        game_cash b  
    on a.department=b.department and a.cash<=b.cash
    order by a.department,a.game
    ) t
group by department,game
having rk<=2

10.求每个部门除去第一名和最后一名的平均薪资

表结构: dep uid cash

select 
    dep,
    avg(cash) as avg_fee 
from(
    select 
        dep,
        uid,
        cash,
        row_number() over(partition by dep order by cash) as rk1,
        row_number() over(partition by dep order by cash desc) as rk2
    from 
        test
    ) t 
where rk1>1 and rk2>1 
group by dep
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,837评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,196评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,688评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,654评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,456评论 6 406
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,955评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,044评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,195评论 0 287
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,725评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,608评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,802评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,318评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,048评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,422评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,673评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,424评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,762评论 2 372

推荐阅读更多精彩内容

  • 对于数据分析师而言,把数取对是一项最基本的能力,因为所有的数据加工、分析工作都依赖于这一步。在互联网公司笔试中SQ...
    小素数阅读 1,130评论 0 3
  • 本篇内容 主要讲述一些常用的函数、语法,结合案例、面试题来进行实践。 日期函数 date_sub('',n) 和d...
    我是大成子阅读 566评论 0 0
  • 一、Hive基本概念 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提...
    CJ21阅读 1,755评论 0 13
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本...
    felix521阅读 1,319评论 0 0
  • 版本:V1.0 第0题表结构:uid,subject_id,score求:找出所有科目成绩都大于某一学科平均成绩的...
    故里良田阅读 3,015评论 0 0