HiveSQL——连续增长问题

注:参考文章:

SQL连续增长问题--HQL面试题35_sql判断一个列是否连续增长-CSDN博客文章浏览阅读2.6k次,点赞6次,收藏30次。目录0 需求分析1 数据准备3 小结0 需求分析假设我们有一张订单表shop_order shop_id,order_id,order_time,order_amt 我们需要计算过去至少3天销售金额连续增长的商户shop_id。数据如下:shop_idorder_amtorder_time11002021-05-10 10:03:5411012021-05-10 10:04:5413002021-0_sql判断一个列是否连续增长https://blog.csdn.net/godlovedaniel/article/details/119080882

0 需求描述

现有一张订单表shop_order ,含有字段shop_id,order_id,order_time,order_amt, 需要统计过去至少连续3天销售金额连续增长的商户shop_id。

1 数据准备

sql 复制代码
create table shop_order(
    shop_id int,
    order_amt int,
    order_time string
)
row format delimited fields terminated by '\t';
load data local inpath "/opt/module/hive_data/shop_order.txt" into table shop_order;

2 数据分析

完整的代码如下:

sql 复制代码
with tmp as (
    select
        shop_id,
        to_date(order_time) as dt,
        sum(order_amt)      as amt
    from shop_order
    group by shop_id, to_date(order_time)
)
select
    shop_id
from (select *,
            -- 判断日期是否连续
             date_sub(dt, row_number() over (partition by shop_id order by dt )) as order_date_diff
      from (
               select
                   shop_id,
                   dt,
                   amt,
             --判断销售额是否增长
             -- 当前行的销售金额与上一行的销售金额之间的差值 order_amt_diff
                   amt - lag(amt, 1, 0) over (partition by shop_id order by dt) as order_amt_diff 
               from tmp
           ) t1
        -- 差值大于0的代表销售额增长
      where order_amt_diff > 0
     ) t2
group by shop_id, order_date_diff
having count(1) >=3;

输出结果为 shop_id 为2

上述代码分析:

**step1:**求出每家商户销售金额连续增长的记录

sql 复制代码
with tmp as (
    select
        shop_id,
        to_date(order_time) as dt,
        sum(order_amt)      as amt
    from shop_order
    group by shop_id, to_date(order_time)
)

select *
from (
         select
             shop_id,
             dt,
             amt,
             --判断销售额是否增长
             -- 当前行的销售金额与上一行的销售金额之间的差值 order_amt_diff
             amt - lag(amt, 1, 0) over (partition by shop_id order by dt) as order_amt_diff
         from tmp
     ) t1
        -- 差值大于0的代表销售额增长
where order_amt_diff > 0

step2: 求出每家商户至少连续3天销售金额连续增长**,在step1的基础上,还要求dt是连续的**

sql 复制代码
with tmp as (
    select
        shop_id,
        to_date(order_time) as dt,
        sum(order_amt)      as amt
    from shop_order
    group by shop_id, to_date(order_time)
)

select *,
      -- 判断日期是否连续
       date_sub(dt, row_number() over (partition by shop_id order by dt )) as order_date_diff
from (
         select
             shop_id,
             dt,
             amt,
             --判断销售额是否增长
             -- 当前行的销售金额与上一行的销售金额之间的差值 order_amt_diff
             amt - lag(amt, 1, 0) over (partition by shop_id order by dt) as order_amt_diff
         from tmp
     ) t1
    -- 差值大于0的代表销售额增长
where order_amt_diff > 0

**step3:**对商户shop_id以及日期差值order_date_diff这两个字段分组,求出最终结果

sql 复制代码
with tmp as (
    select
        shop_id,
        to_date(order_time) as dt,
        sum(order_amt)      as amt
    from shop_order
    group by shop_id, to_date(order_time)
)
select
    shop_id
from (select *,
            -- 判断日期是否连续
             date_sub(dt, row_number() over (partition by shop_id order by dt )) as order_date_diff
      from (
               select
                   shop_id,
                   dt,
                   amt,
             --判断销售额是否增长
             -- 当前行的销售金额与上一行的销售金额之间的差值 order_amt_diff
                   amt - lag(amt, 1, 0) over (partition by shop_id order by dt) as order_amt_diff --判断是否增长
               from tmp
           ) t1
        -- 差值大于0的代表销售额增长
      where order_amt_diff > 0
     ) t2
group by shop_id, order_date_diff
having count(1) >=3;

3 小结

date_sub(日期减少函数)

  • 语法:date_sub(string startdate,int days)
  • 返回值:string
  • 说明:返回 开始日期startdate 减去days天后的日期
  • 举例:select date_sub('2024-02-01',3) --->2024-01-29

lag

  • 语法:lag(column,n,default) over(partition by ....order by....)
  • 说明:取得column列前边的第n行数据,如果存在则返回,如果不存在,返回默认值default

针对【日期连续 】等类型的题型,一般处理思路:先计算date_sub(dt, row_number() over (partition by shop_id order by dt )) as dt_diff ,再对 dt_diff 分组,求count()值

针对【xx连续增长 】等类型的题型,一般处理思路:利用前后函数lag或者lead 往前/往后取一行,计算两者的差值diff ,再利用 if( diff >0,1,0) as flag 等条件判断函数 进行打标签,基于标签再进行后续的分组计算.......

相关推荐
weixin_3077791318 分钟前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
一个天蝎座 白勺 程序猿2 小时前
大数据(4.6)Hive执行引擎选型终极指南:MapReduce/Tez/Spark性能实测×万亿级数据资源配置公式
大数据·hive·mapreduce
HelpHelp同学3 小时前
信息混乱难查找?三步搭建高效帮助中心解决难题
大数据·人工智能·知识库管理系统
TDengine (老段)9 小时前
TDengine 中的关联查询
大数据·javascript·网络·物联网·时序数据库·tdengine·iotdb
直裾13 小时前
Mapreduce的使用
大数据·数据库·mapreduce
麻芝汤圆15 小时前
使用 MapReduce 进行高效数据清洗:从理论到实践
大数据·linux·服务器·网络·数据库·windows·mapreduce
树莓集团16 小时前
树莓集团海南落子:自贸港布局的底层逻辑
大数据
不剪发的Tony老师16 小时前
Hue:一个大数据查询工具
大数据
靠近彗星16 小时前
如何检查 HBase Master 是否已完成初始化?| 详细排查指南
大数据·数据库·分布式·hbase