043-经典SQL|常考SQL场景之小鹏汽车充电每辆车连续快充次数
今天手撕小鹏汽车每辆车连续快充次数题
场景 【043-经典SQL|常考SQL场景之小鹏汽车充电每辆车连续快充次数】小鹏汽车充电有两种类型,快充、慢充,有如下数据:
车辆ID充电时间充电类型
a20200601 19:21:091
a20200611 11:30:091
a20200621 21:10:090
a20200701 19:01:091
a20200701 20:30:091
a20200701 21:00:090
a20200702 20:30:001
a20200703 09:01:091
a20200704 12:05:091
b20200706 12:20:090
其中1为快充,0为慢充,求每辆车最长 连续快充次数 ,以上例子结果为
a 3
b 0
建表 为了方便,我直接在SQL-Server上建表了
如下
CREATE TABLE dbo.card_charger_details (
card_id varchar(2) NOT NULL ,-- 车辆ID
charge_time datetime2(7) NULL , -- 充电时间
charger_type_id tinyint NULL-- 充电类型
)
分析
- 根据车辆排序,和根据车辆,充电类型排序
- 这两个排序相减得出一个间隔
- 统计这个次数,取最大值而且是快充类型的即可
-- 两个排序之间的间隔
select *
,(a.rn1-a.rn2) as diff_rn-- 间隔差
from (
select card_id
,charge_time
,charger_type_id
,row_number() over (partition by card_id order by charge_time asc ) as rn1
,row_number() over (partition by card_id,charger_type_id order by charge_time asc) as rn2
from card_charger_details t
)a
order by card_id, rn1, rn2
文章图片
实现
select a.card_id
,isnull(max(b.continuous_cnt),0) asmax_continuous_cnt
from (select card_id from card_charger_details group by card_id) a
left join
( select card_id
,charger_type_id
,diff_rn
,count(1) continuous_cnt
from (select *
,(a.rn1-a.rn2) diff_rn
from (select card_id
,charge_time
, charger_type_id
, row_number() over (partition by card_id order by charge_time asc ) as rn1
, row_number() over (partition by card_id,charger_type_id order by charge_time asc) as rn2
from card_charger_details t
) as a
)b
group by card_id
,charger_type_id
,diff_rn) b
on a.card_id = b.card_id
and charger_type_id = 1-- 限定快充类型
group by a.card_id
结果
文章图片
附上插入数据语句
-- ----------------------------
-- Records of card_charger_details
-- ----------------------------
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-06-01 19:21:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-06-11 11:30:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-06-21 21:10:09.0000000', N'0')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-01 19:01:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-01 20:30:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-01 21:00:09.0000000', N'0')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-02 20:30:00.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-03 09:01:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-04 12:05:09.0000000', N'1')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'b', N'2020-07-06 12:20:09.0000000', N'0')
GO
GO
INSERT INTO [dbo].[card_charger_details] ([card_id], [charge_time], [charger_type_id]) VALUES (N'a', N'2020-07-06 11:10:09.0000000', N'0')
GO
GO
推荐阅读
- 这份史上最经典的3大学习方法,清华北大学霸都在用!
- py连接mysql
- 我们为什么喜欢看《古惑仔》,它到底经典在哪()
- 2019-01-18Mysql中主机名的问题
- MySql数据库备份与恢复
- mysql|InnoDB数据页结构
- 数据库|SQL行转列方式优化查询性能实践
- mysql中视图事务索引与权限管理
- MYSQL主从同步的实现
- MySQL数据库的基本操作