当前位置: 首页 > 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.mrgr.cn/news/71202.html

相关文章:

  • spring cloud 入门笔记1(RestTemplate,Consul)
  • D3入门:概念、主要特点、基本功能、常见应用场景
  • Oracle 外键
  • 关于Dell r730xd 老服务器的阵列卡 配置系统盘RAID 1
  • 嵌入式ARM平台Linux网络实时性能优化
  • 如何开展小组讨论以强化员工对六西格玛的关注度?
  • 创业铁盘论
  • 超级计算机挑战人类智力,谁才是最后赢家?
  • 发社交动态,小心它泄露了你的隐私——不只是地理位置,还有眼神中倒影成像
  • 百度世界2024:AI应用的浪潮时刻
  • Docker--Docker是什么和对Docker的了解
  • 为什么管道符|无法写入txt
  • 【GPTs】Email Responder Pro:高效生成专业回复邮件
  • 局域网桥接只能单向ping问题,arp无法建立
  • 【缓存策略】你知道 Write Through(直写)这个缓存策略吗?
  • 1.vue环境搭建
  • 如何快速查看在 GitHub 上的所有PR提交记录
  • 微信机器人接入聊天模块
  • fastapi 查询参数支持 Pydantic Model:参数校验与配置技巧
  • IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发
  • 【Python进阶】Python中的数据库交互:使用SQLite进行本地数据存储
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-小蓝的目标
  • 国标GB28181-2022平台EasyGBS国标GB28181软件在GB/T28181协议中的加密措施
  • 2024要如何对公司CAD图纸进行加密?十种方法加密保护图纸!
  • GitHub4.2k Java开源神器一个免费的基于JNA的Java操作系统和硬件信息库
  • 重磅!Pubmed停止更新了?