SQL Server中如何将累积数值拆解

概要

本文通过一个计算汽车每日里程数的例子,展现如何通过汽车每日的总里程数,来计算汽车每日的里程数。

代码及实现

每辆汽车中都有一个里程数表,记录汽车从出场到当前行驶的里程数,下表是一样汽车的里程数表,该表已经进行简化,删去不相关的业务数据。

汽车终端每日会定时将当前的总里程数写入下表,下表的cars列作为汽车的唯一性标识; days标识具体哪一天; cumulative_distance 表示该车到当前这天的总里程数。

我们需要计算每辆汽车每天的里程数
在这里插入图片描述
表名是travel_car

基本思路

对于car1,在第一天其里程数是50,第二天应该是100-50,第三天应该是200-100。所以计算每天的里程数应该是当天的总里程数减去前一天的从里程数。相当于对每辆车的里程数做一次错位相减。

从数据库的查询的角度,我们需要获取每量车前一天的总里程数,也就是按照days排序的前一天数据的cumulative_distance 。

根据已有的需求,显然窗口函数是最佳解决方案。

代码实现

解决方案1

我们采用lag方法获取每辆车,前一天的里程数。由于涉及到较多子查询,所以选用CTE代替子查询。

with cte1 as (select *, isnull(lag(cumulative_distance) over (partition by cars order by [days]),0) as previousDayDistancefrom travel_car
)

增加previousDayDistance列,通过lag函数找到每辆车前一天的里程数。对于day1而言,它没有前一条数据,所以会返回null, 因此使用isnull 方法,将null转成0。

然后将里程数相减,得到每日的里程数。

with cte1 as (select *, isnull(lag(cumulative_distance) over (partition by cars order by [days]),0) as previousDayDistancefrom travel_car
)select *, (cumulative_distance - previousDayDistance) as cuurent_day_distance from cte1

解决方案2

解决方案1中的lag方法只能在SQL Server 2014或更高的版本中运行。无法在低版本的SQL Server 中运行。

因此我们提出解决方案2。我们不再通过lag方法找到前一天每辆车的里程数,而是通过row_number方法进行排序和自连接来找到每辆车前一天的里程数。

with cte1 as (select *, ROW_NUMBER() over (partition by cars order by days) as rn from travel_car),cte2 as (select t1.id, t1.cars, t1.[days], t1.cumulative_distance,isnull(t2.cumulative_distance, 0) as previousDayDistance ,t1.rn  from cte1 t1left join cte1 t2on t1.rn = t2.rn+1 and t1.cars = t2.cars)select *, (cumulative_distance - previousDayDistance) as cuurent_day_distance  from cte2
  1. 为每辆车生成row number,按照汽车分组,按照days排序;
  2. 按照rownumber+1和汽车的标识进行表格自连接,找到上一次的汽车里程数;
  3. 然后将里程数相减,得到每日的里程数。

附录

建表语句和数据初始化:

if OBJECT_ID('travel_car', 'U') is not nulldrop table travel_car
create table travel_car (id int primary key identity (1,1),cars varchar(20) not null,[days] varchar(40) not null,cumulative_distance int not null
)insert into travel_car (cars, [days], cumulative_distance) values('car1','day1', 50),
('car1','day2', 100),
('car1','day3', 200),('car2','day1', 0),('car3','day1', 0),
('car3','day2', 50),
('car3','day3', 50),
('car3','day4', 100)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack compose——深入了解Diffing

Diffing是什么 "Diffing" 是 Jetpack Compose 中用于优化性能的一种技术。它的工作原理是比较新旧 UI 树,并只更新实际发生变化的部分。这意味着即使你的应用有大量的 UI,Compose 也能保持高效的性能。 当 Composable 函数被重新调用&#x…

MybatisX插件自动生成sql失效问题的详细分析

mybatis框架提供了非常好用的逆向工程插件,但是根据数据库驱动版本的不同会出现一些问题。 在使用mybatisX插件的时候使用Generate mybatis sql无法实现自动生成sql 解决方案: 1.首先检查自己的数据库中表是否有主键,如果没有主键是不会生…

Jetpack Compose与Accompanist:改变Android UI开发的方式

在Android开发中,UI开发一直是一个重要的部分。Google推出的Jetpack Compose库为开发者提供了一种全新的声明式UI工具,使得UI开发变得更加简单和直观。而Accompanist库则为Jetpack Compose提供了一系列有用的扩展,进一步提升了开发效率。 Jet…

考研的尽头是考公?

2022年12月23日,作为中国诞生于互联网的职业考试培训行业市场领导者的粉笔有限公司(“粉笔”或“公司”) ,早前通过港交所上次聆讯后开始招股。 据悉,粉笔计划发售20,000,000股股份(…

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三 [知识点 1] 名词性从句问题:到底什么是名词笥从句?例 1:我的东西你都可以随便用例 2:不管是谁,放你鸽子就是混蛋例 3:说那种话的…

flutter:数据持久化

简单的数据持久化 保存数据到本地磁盘是应用程序常用功能之一,比如保存用户登录信息、用户配置信息等。而保存这些信息通常使用 shared_preferences,它保存数据的形式为 Key-Value(键值对),支持 Android 和 iOS。shar…

安装git工具

下载安装地址: Git - Downloading Package (git-scm.com) 命令安装:创建文件夹下载路径 启动powershell 输入命令:winget install --id Git.Git -e --source winget 等待下载安装

查询子节点 postgresql

数据库为postgresql WITH RECURSIVE cte AS (SELECTn. ID,n. com_name,n."parentId" AS pidFROMcompany AS nWHEREn. ID = 2UNION ALLSELECTr. ID,r. com_name,cte. ID AS pidFROMcteJOIN company AS r ON r.

Linux命令之nc命令

一、命令简介 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉。nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。nc命令的主要作用如下: 实现任意TCP/UDP端口的侦听,nc可以作为server以T…

electron打包exe桌面项目打开控制台

阿丹: 之前一直在写web项目,按F12开发控制台很方便但是。现在项目涉及到了桌面的应用这就需要在打包的过程中进行书写配置文件main中添加指令来在app加载完成后打开控制台,这样方便我们寻找报错。 打开方式1 因为使用的工具是electron所以找…

华为云书库《Spring Boot2系列实战教程》电子书

华为开发者大会PaaS生态电子书推荐,助你成为了不起的开发者! 处理Spring Boot 常见企业级需求,《Spring Boot2系列实战教程》来了! 点击下方进入华为云官网 https://auth.huaweicloud.com/authui/login.html?localezh-cn&…

win11预览版更新,并尝试使用Copilot

文章目录 win11预览版更新,并使用Copilot先说结果所需内容具体操作更新操作系统版本更新Edge安装ViVeTool v0.3.3 测试Copilot问题唯一优点 总结 win11预览版更新,并使用Copilot 先说结果 体验一言难尽,就相当于是一个快捷聊天提问窗口。 自…