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

news2024/11/25 7:46:50

概要

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

代码及实现

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

汽车终端每日会定时将当前的总里程数写入下表,下表的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 previousDayDistance
	 from 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 previousDayDistance
	 from 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 t1
			left join cte1 t2
			on 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 null
	drop 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.coloradmin.cn/o/718319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elastic Stack之Logstash Beats

文章目录 Logstash简介&运行流程使用(日志采集)常用操作查看线程 BeatFilebeat Logstash 简介&运行流程 教程 一文快速上手Logstash 使用(日志采集) 配置logstash使用elasticsearch作为logstash后端 在logstash\bin目录…

Spring容器获取Bean的9种方式 | 京东云技术团队

1 前言 随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对…

postgres数据库基础操作-ok

文章目录 1. 链接数据库2. 库操作2.1 创建库2.2 查看数据库2.3 切换数据库2.4 修改库名2.5 删除数据库 3. 表操作3.1 创建表3.2 查看table list3.3 删除表 4. 数据操作4.1 插入数据4.2 查询数据4.3 删除数据 5. 用户&权限5.1 创建用户5.2 查看用户5.3 删除用户5.4 修改用户…

spring cloud +java企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保…

5.设计模式之思维导图整理

1.七大原则 2.分类 3.23大设计模式 //展开 ![ 在这里插入图片描述](https://img-blog.csdnimg.cn/070e9ba070a54a22ab4a05653ae1cf27.png)

钡铼技术多功能RTUS475:稳定可靠的油田数据采集解决方案

标题:S475在油田数据采集中的应用 摘要:本文介绍了钡铼技术多功能RTUS475在油田数据采集中的应用。该设备基于高性能微处理器MCU和嵌入式实时操作系统,支持Modbus Slave和Modbus Master功能,并能通过无线网络实现短信报警和数据传…

华为OD机试真题 Python 实现【木板】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 小明有n块木板,第块木板的长度为a_i。 小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上&#xff0…

虚机Centos忘记密码如何重置 -- 小黑日常超细教学

有时候虚机太多,会忘记有一些虚机的密码,当启动机器的时候那我们可以尝试重置虚机密码然后登录。 日常的小技能记述!! 目录 一、 演示虚机为centos7系列 二、进入开机前的页面,选中第一个,按“e”键&…

idea中如何过滤某些文件不提交

文章目录 前言设置.gitignore文件解决方案 设置新的忽略文件具体步骤如下 常用过滤文件 前言 在开发过程中,经常会遇到一些文件是我们不想提交的内容。那么应该如何过滤掉?不去提交到我们的git仓库? 比如,我们常用的一些配置文件…

MBD开发 STM32 UASRT

目录 轮询 ptintf 中断方式 DMA方式 轮询 串口要加入这两个文件 bug在于接到10个后会一直发送 ptintf function buffPtr convert(buff)if coder.target(Sfun)%固定句式%Executing in MATLAB, Buff is nullbuffPtr uint32(0); elsecoder.cinclude(getBuffPtr.h);%加入头…

Apikit 自学日记:智能 Mock 规则

功能入口:API管理应用 / 公共资源菜单 / 智能 Mock 设置 二级菜单在编写API文档返回结果时,若参数字段和类型匹配智能Mock规则,系统则会自动填入对应的Mock值。该功能提供无感的快速mock值配置,减轻mock规则配置的工作负担。 智能…

Dubbo学习记录

Dubbo学习记录 一、Dubbo架构二、Provider启动Dubbo1.实现类的Service注解2.Dubbo的配置信息3.引入web.xml,加载Spring核心配置文件,才可以扫描到Dubbo的配置信息 二、Consumer启动Dubbo1.Autowired改为Reference2.qos介绍:Dubbo远程监控和控…

LeetCode 打卡day54-55 动态规划之编辑距离问题

一个人的朝圣 — LeetCode打卡第54-55天 知识总结 Leetcode 392. 判断子序列题目说明代码说明 Leetcode 115. 不同的子序列题目说明代码说明 Leetcode 583. 两个字符串的删除操作题目说明代码说明 Leetcode 72. 编辑距离题目说明代码说明 知识总结 今天学习动态规划里面的编辑…

《零基础学PIC单片机》目录

《零基础学PIC单片机》目录 1.《零基础学PIC单片机》,作者:赵化启 1.1芯片架构和指令 芯片架构和指令需要较多时间消化。 PIC单片机系统结构,讲解各模块的结构和功能;PIC汇编指令 1.2具有参考价值的内容 第3章:电…

批发零售行业应该如何选择进销存软件?

一、什么是进销存软件 进:需要将产品采购入库,自动生成采购明细台账同时关联财务生成付款账单; 销:是指对客户的销售订单记录,汇总生成产品销售明细及回款计划; 存:库存的日常盘点与统计&…

看一眼Mysql查询语句

目录 🛻 查询数据 🛻基本查询语句 🛻单表查询 🚕查询所有字段 🚕查询指定字段 🚕查询指定记录 🚕带in关键字的查询 🚕带between and的范围查询 🚕带like的字符匹…

一文带你了解socket网络编程以及详解过程和原理

创作不易,期望亲友们给个免费的就行 文章目录 一、什么是socket二、TCP/IP三、socket原理四、代码说明五、API函数 一、什么是socket Socket(套接字)是计算机网络编程中的一种抽象概念,它提供了在网络上进行通信的接口。通过使用…

RankNet(pairwise)

原论文&#xff1a;From ranknet to lambdarank to lambdamart: An overview 构造样本&损失函数 首先对同一个query下返回的连接&#xff0c;进行配对构造样本<Ui, Uj>代表了一对样本。用Pij代表样本的得分&#xff0c;si,sj代表了模型对样本的打分。 有了样本模型…

处理 Windows Server 中 CVE-2016-2183(SSL/TLS) 漏洞的方法

一、漏洞说明 Windows server 2008或2012远程桌面服务SSL加密默认是开启的&#xff0c;且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷&#xff0c;当开启远程桌面服务&#xff0c;使用漏洞扫描工具扫描&#xff0c;发现存在SSL/TSL漏洞。 例如如下漏洞&#xff1a; 二、…

(02)Cartographer源码无死角解析-(75) 2D后端优化→整体复盘,理解后端优化核心思想

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…