常考SQL场景之小鹏汽车充电每辆车连续快充次数

本文主要是介绍常考SQL场景之小鹏汽车充电每辆车连续快充次数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天手撕小鹏汽车每辆车连续快充次数题

场景

小鹏汽车充电有两种类型,快充、慢充,有如下数据:

车辆ID   充电时间           充电类型 
a        20200601 19:21:09  1
a        20200611 11:30:09  1
a        20200621 21:10:09  0
a        20200701 19:01:09  1
a        20200701 20:30:09  1
a        20200701 21:00:09  0
a        20200702 20:30:00  1
a        20200703 09:01:09  1
a        20200704 12:05:09  1
b        20200706 12:20:09  0

其中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) as  max_continuous_cnt from (select card_id from card_charger_details group by card_id) aleft 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) bon a.card_id = b.card_idand 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

这篇关于常考SQL场景之小鹏汽车充电每辆车连续快充次数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717712

相关文章

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作