SQL面试题挑战15:sql实现分钟级的趋势图

问题

在Hive或者ODPS中,怎么用sql实现分钟级的趋势图?比如从交易表中,如何统计0点到每分钟的交易趋势图?

原表:trade_A(trade_id,pay_time(格式是2020-08-05 10:30:28),pay_gmv)。希望用sql实现分钟级的0点到当前分钟的GMV。
结果表:result_A(minute_rn(分钟顺序),pay_gmv_td(每分钟的交易额,都是0点到当前分钟的累加值))。
以下是示例数据:


with tmp as (
    select 101 as trade_id,'2020-08-05 00:30:28' as pay_time,100 as pay_gmv
    union all
    select 102 as trade_id,'2020-08-05 00:30:58' as pay_time,200 as pay_gmv
    union all
    select 103 as trade_id,'2020-08-05 00:35:28' as pay_time,300 as pay_gmv
    union all
    select 104 as trade_id,'2020-08-05 01:36:28' as pay_time,400 as pay_gmv
    union all
    select 105 as trade_id,'2020-08-06 00:20:28' as pay_time,500 as pay_gmv
    union all
    select 106 as trade_id,'2020-08-06 00:21:28' as pay_time,600 as pay_gmv
)

sql解答

其实这个题的核心就是使用sql生成分钟级的序列,与之前SQL面试题挑战08:补全缺失日的月销售累计的场景类似。然后关联原表,做开窗累加即可。而且生成分钟级的这段代码是可以收藏以后作为工具代码使用的。

select
minute_rn
-- 开窗累加即可
,sum(pay_gmv) over(partition by date_format(minute_rn,'yyyy-MM-dd') order by minute_rn) as pay_gmv_td -- 按当前时间按天开窗累加,得到每分钟的累计销售额
from
(
    -- 根据数据中的日期生成连续的分钟序列。从最小日期的0点到最大日期的23:59分
    select
    t1.minute_rn
    ,nvl(t2.pay_gmv,0) as pay_gmv
    from
    (
        select
        from_unixtime(unix_timestamp(t1.min_pay_time)+tab.pos*60,'yyyy-MM-dd HH:mm') as minute_rn
        from
        (
            select
            min(date_format(pay_time,'yyyy-MM-dd 00:00:00')) as min_pay_time --取最小日期
            ,max(date_format(pay_time,'yyyy-MM-dd 23:59:59')) as max_pay_time --取最大日期
            from tmp
        )t1
        lateral view posexplode(split(repeat(',',(unix_timestamp(max_pay_time)-unix_timestamp(min_pay_time))/60),',')) tab as pos,val
    )t1
    left join
    (   
        -- 先按同分钟的数据进行一次聚合
        select
        date_format(pay_time,'yyyy-MM-dd HH:mm') as pay_time
        ,sum(pay_gmv) as pay_gmv
        from tmp
        group by date_format(pay_time,'yyyy-MM-dd HH:mm')
    )t2
    on t1.minute_rn=t2.pay_time
)t1
;

相关推荐

  1. SQL面试挑战15sql实现分钟趋势

    2024-02-09 11:02:01       32 阅读
  2. SQL面试挑战14:每年在校人数

    2024-02-09 11:02:01       39 阅读
  3. SQL面试挑战13分组topN

    2024-02-09 11:02:01       40 阅读
  4. SQL面试挑战11:访问会话切割

    2024-02-09 11:02:01       34 阅读
  5. SQL面试挑战10:累计占比

    2024-02-09 11:02:01       36 阅读
  6. SQL面试挑战06:互相关注

    2024-02-09 11:02:01       32 阅读
  7. SQL面试挑战03:奖金瓜分问题(拼多多)

    2024-02-09 11:02:01       39 阅读
  8. SQL面试挑战04:找出使用相同ip用户

    2024-02-09 11:02:01       37 阅读
  9. SQL面试挑战08:补全缺失日月销售累计

    2024-02-09 11:02:01       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-09 11:02:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-09 11:02:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-09 11:02:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-09 11:02:01       20 阅读

热门阅读

  1. Debezium发布历史117

    2024-02-09 11:02:01       31 阅读
  2. Android studio 六大基本布局详解

    2024-02-09 11:02:01       29 阅读
  3. Acwing143最大异或对

    2024-02-09 11:02:01       27 阅读
  4. Vivado用ILA抓波形保存为CSV文件

    2024-02-09 11:02:01       30 阅读
  5. c#通过ExpressionTree 表达式树实现对象关系映射

    2024-02-09 11:02:01       26 阅读
  6. 38. C++ 引用的本质

    2024-02-09 11:02:01       27 阅读
  7. 序列化和反序列化、pytest-DDT数据驱动

    2024-02-09 11:02:01       34 阅读
  8. 2024.2.6

    2024-02-09 11:02:01       28 阅读