当前位置: 首页 > news >正文

SQL面试题——奔驰面试题

SQL面试题——奔驰SQL面试题

我们的表大致如下

CREATE TABLE signal_log(
vin STRING COMMENT'vehicle frame id',
signal_name STRING COMMENT'function name',
signal_value STRING COMMENT 'signal value' ,
ts BIGINT COMMENT'event timestamp',
dt STRING COMMENT'format yyyy-mm-dd'
)

下面给出了一些样例数据

image-20241112141835629

说明

  1. 信号power_mode(驾驶模式: SPORT/NORMAL/ECO/COMFORT)2)
  2. 信号odometer_value (里程表示数: km)
  3. power mode上报的同一个ts,会有odometer value记录上报
  4. 信号记录有重复上报的情况
  5. ts 单位为秒

问题

  1. 对于每个车辆,统计每天行驶的距离及总共使用过的驾驶模式 (power_mode)个数
  2. 统计每个车辆,在不同驾驶模式下的总行驶的时间 (单位:秒)
  3. 计算每个车辆的驾驶偏好 (驾驶时间越长则表示越偏好;展示第一、第二偏好)

分析

  1. 这里给出的都是样例数据,ts 和我们平常看到的都不一样
  2. signal_value 存储的是不同信号上报上来的值,具体是数值还是字符串取决于signal_name,也就是说所有的信号值都放在一起了,我们处理的时候可能需要针对不同信号值单独处理

问题一 对于每个车辆,统计每天行驶的距离及总共使用过的驾驶模式

这个问题就很简单了

  1. 驾驶模式的信号是power_mode,我们过滤一下,直接统计即可
selectvin,dt,count(distinct signal_value) power_mode_cnt
fromsignal_log
wheresignal_name='power_mode'
group byvin,dt
  1. 每天行驶的距离我们只需要用当天最大的里程数减去最小的里程数即可
selectvin,dt,max(signal_value)-min(signal_value)
fromsignal_log
wheresignal_name='odometer_value '
group byvin,dt

这两个放在一起的话,我们可以这样写

selectvin,dt,count(distinct if(signal_name='power_mode',signal_value,"")) -1  as power_mode_cnt,max(if(signal_name='odo_value',signal_value,NULL))-min(if(signal_name='odo_value',signal_value,NULL))
fromlog
group byvin,dt

问题二 统计每个车辆,在不同驾驶模式下的总行驶的时间 (单位:秒)

我们上报上来的数据包含当前的驾驶模式和当前时间戳,我们可以把下次上报上来的时间减去当前时间的差作为这个驾驶模式的形式时间,很多人可能会说要不要判断下次上来的驾驶模式是不是和当前的相当呀

我们举个例子

SPORT TS1
SPORT TS2
SPORT TS3
NORMAL TS4
NORMAL TS5
SPORT TS6

如果相等作为条件,SPORT 的驾驶时长就是TS3-TS1,如果没有这个条件SPORT 的驾驶时长就是TS4-TS1

这里我们可以当作没有这个条件进行处理,因为传感器信号其实是很密集的,所以误差很小

那这个问题就很简单了,我们获取下一次上报的时间和当前时间做差,当成当前驾驶模式的形式时间

selectvin,power_mode,sum(time_diff) as total_seconds
from(selectvin,dt,ts as current_time,signal_value as power_modelead(ts,1,unix_timestamp()) over(partition by vin order by ts) next_time-ts as time_difffromsignal_logwheresignal_name='power_mode'
)tmp
group by vin,power_mode

问题三 计算每个车辆的驾驶偏好 (驾驶时间越长则表示越偏好;展示第一、第二偏好)

前面我们已经有了每种驾驶模式的驾驶时间,我们只需要按照驾驶时间排序即可

with tmp as 
selectvin,power_mode,sum(time_diff) as total_seconds
from(selectvin,dt,ts as current_time,signal_value as power_modelead(ts,1,unix_timestamp()) over(partition by vin order by ts)  next_time-ts as time_difffromlogwheresignal_name='power_mode'
)tmp
group by vin,power_mode

唯一需要注意的是,由于是按照每辆车每天的标准去计算,所以相当于分组内排序

select*
from(
selectvin,power_mode,total_secondsrow_number()over(partition by vin order by total_seconds desc) as rn
fromtmp
)t
wherern<=2
http://www.lryc.cn/news/482719.html

相关文章:

  • 24.11.10 css
  • git新手使用教程
  • 运维发展方向
  • jmeter常用配置元件介绍总结之函数助手
  • Pytorch从0复现worc2vec skipgram模型及fasttext训练维基百科语料词向量演示
  • fastapi 查询参数支持 Pydantic Model:参数校验与配置技巧
  • mysql 大数据查询
  • 如何在 Spring Boot 中利用 RocketMQ 实现批量消息消费
  • 推荐一个Star超过2K的.Net轻量级的CMS开源项目
  • 基于驾驶员面部特征的疲劳检测系统
  • 前端知识点---字符串的8种拼接方法(Javascript)
  • 用 Python 从零开始创建神经网络(一):编码我们的第一个神经元
  • 低代码开发
  • sql server 文件和文件组介绍
  • caozha-CEPCS(新冠肺炎疫情防控系统)
  • 1Panel修改PostgreSQL时区
  • 开发一个CRM系统难吗?CRM系统的实现步骤
  • kafka常见面试题总结
  • 前端知识点---Javascript中检测数据类型函数总结
  • aspose如何获取PPT放映页“切换”的“持续时间”值
  • 【MQTT】代理服务比较RabbitMQ、Mosquitto 和 EMQX
  • 【C#/C++】C++/CL中String^的含义和举例,C++层需要调用C#层对象时...
  • Python学习从0到1 day26 第三阶段 Spark ② 数据计算Ⅰ
  • 【详细】如何优雅地删除 Docker 容器与镜像
  • Spring Spring Boot 常用注解总结
  • Flink独立集群+Flink整合yarn
  • 动态规划 之 简单多状态 dp 问题 算法专题
  • qt QPixmapCache详解
  • Redis中的持久化
  • Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称