突然接到一个需求,所有的数据都在一张大表里,想要找出创建时间间隔大于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两行数据相减相关推荐

  1. mysql实现两列数据或者两行数据相减

    注意:两行数据相减必须先转子查询,转为两列后,才能进行相减 select (n.a-n.b) as c from (select (SELECT settlement_amount FROM `dom ...

  2. oracle中日期相减及显示几天几小时几分钟

    1.oracle两时间相减得到相差的时间 https://blog.csdn.net/niu_hao/article/details/45643355 2.oracle 两个时间相减 https:// ...

  3. pandas操作两列日期类型数据相减并要求结果为整数类型

    在 pandas 中,两列日期类型数据相减可以使用减法运算符,结果会得到一个 Timedelta 类型.如果要求结果为整数类型,可以使用其 dt 属性中的 total_seconds 方法,来获取时间 ...

  4. sql查询两个表结果相减_sql子查询两个表的数据相减

    现有表atable和表btable,数据如下: table atable id    anumber 1       500 2       300 3       400 table btable ...

  5. Oracle中时间相减得到天、时、分等

    背景: 数据库中有两个字段如下: 现在想通过这两个字段得到分钟数,通过观察两种日期格式为:'年月日时分秒',我们需要先把字符串转换成日期格式,使用to_date函数,对应的字符串格式为'YYYYMMD ...

  6. Oracle MySQL Hive sql进行相邻数据相减、相加等运算 lad lead 窗口函数 偏移函数

    工作中可能会对同一字段相邻两条数据进行运算,这时候就可以用到偏移函数(Oracle.Hive.MySQL8+通用) 这里用MySQL8+进行演示,准备MySQL数据: DROP TABLE IF EX ...

  7. ORACLE 计算时间相减间隔

    在Oralce中我发现有add_months函数,加天数N可以用如下方法实现,select sysdate+N from dual 在Oralce中我发现有add_months函数,加天数N可以用如下 ...

  8. mysql时间相减得到天数保留两位_mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式...

    /**有一个需求,要求获得两个日期想减的天数,小时数,分钟数.通过查找资料,于是乎我写出了如下代码,来获得两个字段.*/ IFNULL(CONCAT( IF(aib.`forecast_reply_t ...

  9. html 两个时间戳相减,表格里两列时间点如何相减

    EXCEL表中如何让两列时间相减 两列时间,格式是常规,显示如:24时20分,如果我直接相减(比如C1=A1-B时间是特殊的数值形式,直接相减即可 Excel版本参考:2010 测试数据在A1和A2单 ...

最新文章

  1. 再议.Net中null的使用规范
  2. 彻底理解Python生成器和迭代器
  3. DirectX10一变换(三)
  4. update的内部原理
  5. 从原理到方法,一文讲清如何应对C语言内存泄露!
  6. Registry注册机制
  7. adb 重命名_adb中常用的命令
  8. mysql-外键-随堂
  9. 【华为云实战开发】11.如何快速开展嵌入式开发项目?
  10. 【2021牛客暑期多校训练营5】Jewels(建图,最小匹配权,KM乱搞)
  11. 绘制grib2格式大气数据(windows下 GrADS wgrib2 g2ctl perl)
  12. ASP.NET MVC3 异常处理 学习笔记
  13. 【.bash_profile 与 .bashrc 的区别】
  14. Python黑帽子_hack与渗透测试编程之道 第三章代码
  15. VS code编译C或C++
  16. deepin安装NVIDIA显卡驱动
  17. [软件工程基础]结队项目——地铁
  18. LAMMPS学习系列(7)
  19. Publish报文及其响应分析
  20. 椭圆曲线上两种基本的运算:点集运算、P+Q详解

热门文章

  1. 原来勾股定理可以这样证!
  2. c语言计算机图形来画八分画圆,计算机图形学:中点画圆算法
  3. 苹果手机误删照片怎么恢复
  4. 关于华硕笔记本BIOS设置
  5. Win10如何禁止自动更新?Win10禁止更新又恢复怎么办?
  6. Ubuntu 20.04 QGIS update 报错 GPG error: https://ubuntu.qgis.org/ubuntu jammy InRelea
  7. MD5 标准算法详解
  8. 解决IE文件无法正常下载,其他浏览器可以正常下载
  9. Python之数据爬取数据可视化
  10. ReactNative 刘海屏适配iPhoneX