小鹏汽车SQL面试题: 汽车充电每辆车连续快充最大次数

小鹏汽车充电每辆车连续快充最大次数

需求: 小鹏汽车充电每辆车连续快充最大次数
输入
id charge_time charge_type
XP1001 2023/11/20 08:45:00 快充
XP1001 2023/11/21 20:45:00 快充
XP1001 2023/11/22 08:45:00 快充
XP1001 2023/11/23 08:45:00 慢充
XP1001 2023/11/25 08:45:00 快充
XP1002 2023/11/25 08:45:00 快充
XP1002 2023/11/25 12:45:00 快充
XP1002 2023/11/25 23:45:00 慢充
XP1003 2023/11/25 23:45:00 慢充
XP1003 2023/11/26 23:45:00 慢充
输出
id cnts
XP1001 3
XP1002 2
XP1003 0

1.数据准备
CREATE TABLE charging_data (
    id VARCHAR(50),
    charge_time DATETIME,
    charge_type VARCHAR(10)
);

INSERT INTO charging_data (id, charge_time, charge_type)
VALUES
    ('XP1001', '2023-11-20 08:45:00', '快充'),
    ('XP1001', '2023-11-21 20:45:00', '快充'),
    ('XP1001', '2023-11-22 08:45:00', '快充'),
    ('XP1001', '2023-11-23 08:45:00', '慢充'),
    ('XP1001', '2023-11-25 08:45:00', '快充'),
    ('XP1002', '2023-11-25 08:45:00', '快充'),
    ('XP1002', '2023-11-25 12:45:00', '快充'),
    ('XP1002', '2023-11-25 23:45:00', '慢充'),
    ('XP1003', '2023-11-25 23:45:00', '慢充'),
    ('XP1003', '2023-11-26 23:45:00', '慢充');


select * from charging_data;
2.解题思路
  • 分析大维度和小维度是什么,这里大维度是每个汽车的ID,小维度是快充类型
  • 开窗函数构造排名
  • 大维度排名减去小维度排名,生成组ID,观察小维度的变化时刻
  • 按照需求,聚合计算
  • 筛选出复合条件的值
3.解题代码

T1:开窗函数构造排名,大维度是每个汽车的ID,小维度是快充类型,注意观察这里的开窗分组字段

   select
        id,
       charge_time,
       charge_type,
       row_number() over (partition by id order by charge_time) as rm1,
       row_number() over (partition by id,charge_type order by charge_time) as rm2
from charging_data

结果:可以看到在大维度下XP1001,第四次充电是慢充,打断了连续快充在这里插入图片描述
T2:相减可以观察得更清楚,且会生成连续组号(这里cast是类型转换,因为某些MySQL版本开窗出来的类型值不方便相减,hive或者其他数据库可以适当变化)

select
    id,
    charge_time,
    charge_type,
    cast(rm1 as signed ) -cast(rm2 as signed ) as diff
from t1

结果:
1
T3:按照需求聚合

 select id,sum(if(charge_type = '快充',1,0)) as cnt from t2 group by id,group_id

T4:筛选答案

select id,max(cnt) as max_fast_charge  from  t3 group by id

答案3

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值