Oracle两行数据相减
突然接到一个需求,所有的数据都在一张大表
里,想要找出创建时间间隔大于15分钟的数据。
整体思路为——将创建日期转为秒来计算,but如何进行一张表内两行时间列的差值计算呢
。
这里就用了Oracle提供的Lag
函数。
上图为数据样例,就是上一行减去下一行,以此类推知道最后。
现在使用Lag函数将CreateAt列,平移添加另一列Last_CreateAt,这里不是简单的平移而是把CreateAt的第一行作为了Last_CreateAt的第二行
,这样的话,我们将CreateAt-Last_CreateAt就得到了两行之间的差值了
with temp as(SELECT CreateAt, LAG(CreateAt) OVER(ORDER BY CreateAt) Last_CreateAtFROM table1WHERE VIN = 'xxxx' ORDER BY CreateAt
)
select * from temp
下图为使用Lag函数后的样子
接着将日期类型的数值转为秒级使用UNIX_TIMESTAMP
函数
with temp as(SELECT VIN ,CreateAt, LAG(CreateAt) OVER(ORDER BY CreateAt) Last_CreateAt,FROM table1WHERE VIN = 'xxxx' ORDER BY CreateAt
),
temp2 as (SELECT VIN ,CreateAt, Last_CreateAt,UNIX_TIMESTAMP(CreateAt) as seconds,NVL (UNIX_TIMESTAMP(Last_CreateAt),1) as last_secondsFROM temp
)
select * from temp2
转换后的结果图
接着就计算差值呗,将大于15分钟的过滤出来
with temp as(SELECT VIN ,CreateAt, LAG(CreateAt) OVER(ORDER BY CreateAt) Last_CreateAtFROM tabel1WHERE VIN = 'xxxx' ORDER BY CreateAt
),
temp2 as (SELECT VIN ,CreateAt, Last_CreateAt,UNIX_TIMESTAMP(CreateAt) as seconds,NVL (UNIX_TIMESTAMP(Last_CreateAt),1) as last_secondsFROM temp
)
SELECT ROW_NUMBER() OVER ( ORDER BY CreateAt ) AS rid,temp2.CreateAt,temp2.Last_CreateAt,temp2.vin, (temp2.seconds - temp2.last_seconds) as valsFROM temp2 WHERE temp2.last_seconds is not NULLAND (temp2.seconds - temp2.last_seconds) >900
结果图为
那么假设15分钟内的中间有距离,如果想要计算时间大于15分的数据中间的速度,该怎么计算呢。这时需要运用另一个函数Lead
——是将数据往上平移。在本次代码中也就是将Last_CreateAt网上平移,与原始的CreateAt中间形成了一个大于15分钟的区间。这样就可以计算距离了。
下面就将整个代码贡献上来了。
with temp as(
SELECT VIN ,CreateAt, LAG(CreateAt) OVER(ORDER BY CreateAt) Last_CreateAt,VehTotDistance,LAG(VehTotDistance) OVER(ORDER BY CreateAt) last_VehTotDistance
FROM table1
WHERE VIN = 'xxxx'
ORDER BY CreateAt
),
temp2 as (
SELECT VIN ,CreateAt, Last_CreateAt,VehTotDistance,last_VehTotDistance,
UNIX_TIMESTAMP(CreateAt) as seconds,
NVL (UNIX_TIMESTAMP(Last_CreateAt),1) as last_seconds
FROM temp
),
temp3 as(SELECT ROW_NUMBER() OVER ( ORDER BY CreateAt ) AS rid,temp2.CreateAt,temp2.Last_CreateAt,lead(Last_CreateAt) Over(ORDER BY CreateAt) new_Last,VehTotDistance,last_VehTotDistance,lead(last_VehTotDistance) Over(ORDER BY CreateAt) new_last_VehTotDistance,temp2.vin, (temp2.seconds - temp2.last_seconds) as vals
FROM temp2
WHERE temp2.last_seconds is not NULL
AND (temp2.seconds - temp2.last_seconds) >900
)
SELECT temp3.CreateAt beginTime,new_Last endTime,NVL(new_last_VehTotDistance - VehTotDistance,0) Distance,NVL((new_last_VehTotDistance - VehTotDistance)/3600,0) V
FROM temp3
最终的结果为
The End Thanks
Oracle两行数据相减相关推荐
- mysql实现两列数据或者两行数据相减
注意:两行数据相减必须先转子查询,转为两列后,才能进行相减 select (n.a-n.b) as c from (select (SELECT settlement_amount FROM `dom ...
- oracle中日期相减及显示几天几小时几分钟
1.oracle两时间相减得到相差的时间 https://blog.csdn.net/niu_hao/article/details/45643355 2.oracle 两个时间相减 https:// ...
- pandas操作两列日期类型数据相减并要求结果为整数类型
在 pandas 中,两列日期类型数据相减可以使用减法运算符,结果会得到一个 Timedelta 类型.如果要求结果为整数类型,可以使用其 dt 属性中的 total_seconds 方法,来获取时间 ...
- sql查询两个表结果相减_sql子查询两个表的数据相减
现有表atable和表btable,数据如下: table atable id anumber 1 500 2 300 3 400 table btable ...
- Oracle中时间相减得到天、时、分等
背景: 数据库中有两个字段如下: 现在想通过这两个字段得到分钟数,通过观察两种日期格式为:'年月日时分秒',我们需要先把字符串转换成日期格式,使用to_date函数,对应的字符串格式为'YYYYMMD ...
- Oracle MySQL Hive sql进行相邻数据相减、相加等运算 lad lead 窗口函数 偏移函数
工作中可能会对同一字段相邻两条数据进行运算,这时候就可以用到偏移函数(Oracle.Hive.MySQL8+通用) 这里用MySQL8+进行演示,准备MySQL数据: DROP TABLE IF EX ...
- ORACLE 计算时间相减间隔
在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual 在Oralce中我发现有add_months函数,加天数N可以用如下 ...
- mysql时间相减得到天数保留两位_mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式...
/**有一个需求,要求获得两个日期想减的天数,小时数,分钟数.通过查找资料,于是乎我写出了如下代码,来获得两个字段.*/ IFNULL(CONCAT( IF(aib.`forecast_reply_t ...
- html 两个时间戳相减,表格里两列时间点如何相减
EXCEL表中如何让两列时间相减 两列时间,格式是常规,显示如:24时20分,如果我直接相减(比如C1=A1-B时间是特殊的数值形式,直接相减即可 Excel版本参考:2010 测试数据在A1和A2单 ...
最新文章
- 再议.Net中null的使用规范
- 彻底理解Python生成器和迭代器
- DirectX10一变换(三)
- update的内部原理
- 从原理到方法,一文讲清如何应对C语言内存泄露!
- Registry注册机制
- adb 重命名_adb中常用的命令
- mysql-外键-随堂
- 【华为云实战开发】11.如何快速开展嵌入式开发项目?
- 【2021牛客暑期多校训练营5】Jewels(建图,最小匹配权,KM乱搞)
- 绘制grib2格式大气数据(windows下 GrADS wgrib2 g2ctl perl)
- ASP.NET MVC3 异常处理 学习笔记
- 【.bash_profile 与 .bashrc 的区别】
- Python黑帽子_hack与渗透测试编程之道 第三章代码
- VS code编译C或C++
- deepin安装NVIDIA显卡驱动
- [软件工程基础]结队项目——地铁
- LAMMPS学习系列(7)
- Publish报文及其响应分析
- 椭圆曲线上两种基本的运算:点集运算、P+Q详解
热门文章
- 原来勾股定理可以这样证!
- c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
- 苹果手机误删照片怎么恢复
- 关于华硕笔记本BIOS设置
- Win10如何禁止自动更新?Win10禁止更新又恢复怎么办?
- Ubuntu 20.04 QGIS update 报错 GPG error: https://ubuntu.qgis.org/ubuntu jammy InRelea
- MD5 标准算法详解
- 解决IE文件无法正常下载,其他浏览器可以正常下载
- Python之数据爬取数据可视化
- ReactNative 刘海屏适配iPhoneX