大数据技术之Hive SQL题库-中级5

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据技术之Hive SQL题库-中级5

*2.22 查询相同时刻多地登陆的用户

2.22.1 题目需求

从登录明细表(user_login_detail)中查询在相同时刻,多地登陆(ip_address不同)的用户,期望结果如下:

user_id(用户id)

101

102

104

107


2.22.2 代码实现

hive>

select
  distinct t2.user_id
from
  (
   select
     t1.user_id,
     if(t1.max_logout is null ,2,if(t1.max_logout<t1.login_ts,1,0)) flag
   from
     (
      select
        user_id,
        login_ts,
        logout_ts,
        max(logout_ts)over(partition by user_id order by login_ts rows between unbounded preceding and 1 preceding) max_logout
      from
        user_login_detail
   )t1
)t2
where
  t2.flag=0

2.23 销售额完成任务指标的商品

2.23.1 题目需求

商家要求每个商品每个月需要售卖出一定的销售总额

假设1号商品销售总额大于21000,2号商品销售总额大于10000,其余商品没有要求

请写出SQL从订单详情表中(order_detail)查询连续两个月销售总额大于等于任务总额的商品

结果如下:


sku_id(商品id)

1

2.23.2 代码实现及步骤

hive>

-- 求出1号商品 和 2号商品 每个月的购买总额 并过滤掉没有满足指标的商品

select
  sku_id,
  concat(substring(create_date,0,7),'-01') ymd,
  sum(price*sku_num)  sku_sum
from
  order_detail
where 
  sku_id=1 or sku_id=2
group by
  sku_id,substring(create_date,0,7)
having
  (sku_id=1 and sku_sum>=21000) or (sku_id=2 and sku_sum>=10000)
-- 判断是否为连续两个月
select
  distinct t3.sku_id
from
  (
    select
      t2.sku_id,
      count(*)over(partition by t2.sku_id,t2.rymd) cn
    from
      (
        select
          t1.sku_id,
          add_months(t1.ymd,-row_number()over(partition by t1.sku_id order by t1.ymd)) rymd
        from
          (
           select
             sku_id,
             concat(substring(create_date,0,7),'-01') ymd,
             sum(price*sku_num)  sku_sum
           from
             order_detail
           where 
             sku_id=1 or sku_id=2
           group by
             sku_id,substring(create_date,0,7)
           having
             (sku_id=1 and sku_sum>=21000) or (sku_id=2 and sku_sum>=10000)
        )t1
    )t2
)t3
where 
  t3.cn>=2

2.24 根据商品销售情况进行商品分类

2.24.1 题目需求

从订单详情表中(order_detail)对销售件数对商品进行分类,0-5000为冷门商品,5001-19999位一般商品,20000往上为热门商品,并求出不同类别商品的数量

结果如下:

Category(类型)

Cn(数量)

一般商品

1

冷门商品

10

热门商品

1


2.24.2 代码实现

hive>

select
  t2.category,
  count(*) cn
from
  (
    select
      t1.sku_id,
      case 
      when  t1.sku_sum >=0 and t1.sku_sum<=5000 then '冷门商品'
      when  t1.sku_sum >=5001 and t1.sku_sum<=19999 then '一般商品'
      when  t1.sku_sum >=20000 then '热门商品'
      end  category
    from
      (
        select
          sku_id,
          sum(sku_num)  sku_sum
        from
          order_detail
        group by
          sku_id
    )t1
)t2
group by
  t2.category

2.25 各品类销量前三的所有商品

2.25.1 题目需求

从订单详情表中(order_detail)和商品(sku_info)中查询各个品类销售数量前三的商品。如果该品类小于三个商品,则输出所有的商品销量。

结果如下:

Sku_id(商品id)

Category_id(品类id)

2

1

4

1

1

1

8

2

7

2

5

2

12

3

11

3

10

3


2.25.2 代码实现

hive>

select
  t2.sku_id,
  t2.category_id
from
  (
    select
      t1.sku_id,
      si.category_id,
      rank()over(partition by category_id order by t1.sku_sum desc) rk
    from
      (
        select 
          sku_id,
          sum(sku_num) sku_sum
        from
          order_detail
        group by
          sku_id
    )t1
    join
      sku_info si
    on
      t1.sku_id=si.sku_id
    )t2
where 
  t2.rk<=3;

2.26 各品类中商品价格的中位数

2.26.1 题目需求

从商品(sku_info)中球中位数如果是偶数则输出中间两个值的平均值,如果是奇数,则输出中间数即可。

结果如下:

Category_id(品类id)

Medprice(中位数)

1

3500.0

2

1250.0

3

510.0


2.26.2 代码实现

hive>

--求个每个品类价格排序商品数量以及打上奇偶数的标签
select
  sku_id,
  category_id,
  price,
  row_number()over(partition by category_id order by price desc) rk,
  count(*)over(partition by category_id) cn,
  count(*)over(partition by category_id)%2 falg
from
  sku_info  t1
--求出偶数品类的中位数
select
  distinct t1.category_id,
  avg(t1.price)over(partition by t1.category_id) medprice
from
  (
select
  sku_id,
  category_id,
  price,
  row_number()over(partition by category_id order by price desc) rk,
  count(*)over(partition by category_id) cn,
  count(*)over(partition by category_id)%2 falg
from
  sku_info
)t1
where 
  t1.falg=0 and (t1.rk=cn/2  or t1.rk=cn/2+1)
--求出奇数品类的中位数
select
  t1.category_id,
  t1.price
from
  (
    select
      sku_id,
      category_id,
      price,
      row_number()over(partition by category_id order by price desc) rk,
      count(*)over(partition by category_id) cn,
      count(*)over(partition by category_id)%2 falg
    from
      sku_info
)t1
where 
  t1.falg=1 and t1.rk=round(cn/2)
-- 竖向拼接
select
  distinct t1.category_id,
  avg(t1.price)over(partition by t1.category_id) medprice
from
  (
select
  sku_id,
  category_id,
  price,
  row_number()over(partition by category_id order by price desc) rk,
  count(*)over(partition by category_id) cn,
  count(*)over(partition by category_id)%2 falg
from
  sku_info
)t1
where 
  t1.falg=0 and (t1.rk=cn/2  or t1.rk=cn/2+1)
union
select
  t1.category_id,
  t1.price/1
from
  (
    select
      sku_id,
      category_id,
      price,
      row_number()over(partition by category_id order by price desc) rk,
      count(*)over(partition by category_id) cn,
      count(*)over(partition by category_id)%2 falg
    from
      sku_info
)t1
where 
  t1.falg=1 and t1.rk=round(cn/2)

2.27 找出销售额连续3天超过100的商品

2.27.1 题目需求

从订单详情表(order_detail)中找出销售额连续3天超过100的商品

结果如下:

Sku_id(商品id)

1

10

11

12

2

3

4

5

6

7

8

9


2.27.2 代码实现

hive>

-- 每个商品每天的销售总额
select
  sku_id,
  create_date,
  sum(price*sku_num) sku_sum
from
  order_detail
group by
  sku_id,create_date
having 
  sku_sum>=100
--  判断连续三天以上
select
  distinct t3.sku_id
from
  (
    select
      t2.sku_id,
      count(*)over(partition by t2.sku_id,t2.date_drk) cdrk
    from
      (
        select
          t1.sku_id,
          t1.create_date,
          date_sub(t1.create_date,rank()over(partition by t1.sku_id order by t1.create_date)) date_drk
        from
          (
            select
              sku_id,
              create_date,
              sum(price*sku_num) sku_sum
            from
              order_detail
            group by
              sku_id,create_date
            having 
              sku_sum>=100
        )t1
    )t2
)t3
where
  t3.cdrk>=3

2.28 查询有新注册用户的当天的新用户数量、新用户的第一天留存率

2.28.1 题目需求

从用户登录明细表(user_login_detail)中首次登录算作当天新增,第二天也登录了算作一日留存

结果如下:

1686568797076.png

2.28.2 代码实现

hive>

-- 每个用户首次登录时间 和 第二天是否登录 并看每天新增和留存数量 
select
  t1.first_login,
  count(t1.user_id) register,
  count(t2.user_id) remain_1
from
  (
   select
     user_id,
     date_format(min(login_ts),'yyyy-MM-dd')   first_login
   from
     user_login_detail
   group by
     user_id
   )t1
left join
  user_login_detail t2
on
  t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1
group by
  t1.first_login  
-- 新增数量和留存率
select
  t3.first_login,
  t3.register,
  t3.remain_1/t3.register retention
from
  (
   select
     t1.first_login,
     count(t1.user_id) register,
     count(t2.user_id) remain_1
   from
     (
      select
        user_id,
        date_format(min(login_ts),'yyyy-MM-dd')   first_login
      from
        user_login_detail
      group by
        user_id
      )t1
   left join
     user_login_detail t2
   on
     t1.user_id=t2.user_id and datediff(date_format(t2.login_ts,'yyyy-MM-dd'),t1.first_login)=1
   group by
     t1.first_login
)t3

2.29 求出商品连续售卖的时间区间

2.29.1 题目需求

从订单详情表(order_detail)中,求出商品连续售卖的时间区间

结果如下(截取部分):

1686568823009.png

2.29.2 代码实现

hive>

-- 每个商品售卖的日期以及拿到按排序后日期的差值
select
  sku_id,
  create_date,
  date_sub(create_date,rank()over(partition by sku_id order by create_date)) ddrk
from
  order_detail
group by
  sku_id,create_date
-- 拿到每次售卖的区间
select
  distinct
  sku_id,
  first_value(t1.create_date)over(partition by t1.sku_id,t1.ddrk order by t1.create_date  rows between unbounded preceding and unbounded following) start_date,
  last_value(t1.create_date)over(partition by t1.sku_id,t1.ddrk order by t1.create_date  rows between unbounded preceding and unbounded following) end_date
from
  (
   select
     sku_id,
     create_date,
     date_sub(create_date,rank()over(partition by sku_id order by create_date)) ddrk
   from
     order_detail
   group by
     sku_id,create_date
)t1

2.30 登录次数及交易次数统计

2.30.1 题目需求

分别从登陆明细表(user_login_detail)和配送信息表中用户登录时间和下单时间统计登陆次数和交易次数

结果如下(截取部分):

1686568855656.png

2.30.2 代码实现

hive>

-- 拿到每个用户每天的登录次数
select
  user_id,
  date_format(login_ts,'yyyy-MM-dd') login_date,
  count(*) login_count
from
  user_login_detail
group by
  user_id,date_format(login_ts,'yyyy-MM-dd')
-- 拿到每个用户每天的交易次数
select
  t1.user_id,
  t1.login_date,
  collect_set(t1.login_count)[0] login_count ,
  count(di.user_id) order_count
from
  (
   select
     user_id,
     date_format(login_ts,'yyyy-MM-dd') login_date,
     count(*) login_count
   from
     user_login_detail
   group by
     user_id,date_format(login_ts,'yyyy-MM-dd')
)t1
left join
  delivery_info di
on
  t1.user_id=di.user_id and t1.login_date=di.order_date
group by
  t1.user_id,t1.login_date

2.31 按年度列出每个商品销售总额

2.31.1 题目需求

从订单明细表(order_detail)中列出每个商品每个年度的购买总额

结果如下(截取部分):

1686568895799.png1686568905681.png


2.31.2 代码实现

hive> 
select
  sku_id,
  year(create_date) year_date,
  sum(price*sku_num) sku_sum
from
  order_detail
group by
  sku_id,year(create_date)

2.32. 某周内每件商品每天销售情况

2.32.1 题目需求

从订单详情表(order_detail)中查询2021年9月27号-2021年10月3号这一周所有商品每天销售情况。

结果如下:

1686568964869.png


2.31.2 代码实现

hive> 
select
  sku_id,
  year(create_date) year_date,
  sum(price*sku_num) sku_sum
from
  order_detail
group by
  sku_id,year(create_date)

2.33 查看每件商品的售价涨幅情况

2.33.1 题目需求

从商品价格变更明细表(sku_price_modify_detail),得到最近一次价格的涨幅情况,并按照涨幅升序排序。

结果如下:


Sku_id(商品id)

Price_change(涨幅)

8

-200.00

9

-100.00

2

-70.00

11

-16.00

12

-15.00

3

1.00

5

10.00

10

10.00

7

12.00

6

12.00

1

100.00

4

400.00


2.33.2 代码实现

hive>

-- 对每个商品按照修改日期倒序排序 并求出差值
select
  sku_id,
  new_price-lead(new_price,1,0)over(partition by sku_id order by change_date desc) price_change,
  rank()over(partition by sku_id order by change_date desc) rk
from
  sku_price_modify_detail   t1
-- 最近一次修改的价格
select
  t1.sku_id,
  t1.price_change
from
  (
    select
      sku_id,
      new_price-lead(new_price,1,0)over(partition by sku_id order by change_date desc) price_change,
      rank()over(partition by sku_id order by change_date desc) rk
    from
      sku_price_modify_detail
)t1
where 
  rk=1
order by
  t1.price_change  


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
4月前
|
存储 机器学习/深度学习 分布式计算
大数据技术——解锁数据的力量,引领未来趋势
【10月更文挑战第5天】大数据技术——解锁数据的力量,引领未来趋势
|
3月前
|
存储 机器学习/深度学习 SQL
大数据处理与分析技术
大数据处理与分析技术
230 2
|
4月前
|
存储 分布式计算 数据可视化
大数据常用技术与工具
【10月更文挑战第16天】
259 4
|
3月前
|
存储 分布式计算 NoSQL
【赵渝强老师】大数据技术的理论基础
本文介绍了大数据平台的核心思想,包括Google的三篇重要论文:Google文件系统(GFS)、MapReduce分布式计算模型和BigTable大表。这些论文奠定了大数据生态圈的技术基础,进而发展出了Hadoop、Spark和Flink等生态系统。文章详细解释了GFS的架构、MapReduce的计算过程以及BigTable的思想和HBase的实现。
208 0
|
10天前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
64 9
|
4月前
|
存储 数据采集 监控
大数据技术:开启智能决策与创新服务的新纪元
【10月更文挑战第5天】大数据技术:开启智能决策与创新服务的新纪元
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
109 2
|
2月前
|
SQL 运维 大数据
轻量级的大数据处理技术
现代大数据应用架构中,数据中心作为核心,连接数据源与应用,承担着数据处理与服务的重要角色。然而,随着数据量的激增,数据中心面临运维复杂、体系封闭及应用间耦合性高等挑战。为缓解这些问题,一种轻量级的解决方案——esProc SPL应运而生。esProc SPL通过集成性、开放性、高性能、数据路由和敏捷性等特性,有效解决了现有架构的不足,实现了灵活高效的数据处理,特别适用于应用端的前置计算,降低了整体成本和复杂度。
|
3月前
|
机器学习/深度学习 存储 大数据
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系
在大数据时代,高维数据处理成为难题,主成分分析(PCA)作为一种有效的数据降维技术,通过线性变换将数据投影到新的坐标系,保留最大方差信息,实现数据压缩、去噪及可视化。本文详解PCA原理、步骤及其Python实现,探讨其在图像压缩、特征提取等领域的应用,并指出使用时的注意事项,旨在帮助读者掌握这一强大工具。
173 4
|
3月前
|
机器学习/深度学习 存储 大数据
云计算与大数据技术的融合应用
云计算与大数据技术的融合应用