--使用Sql语句,统计出每辆汽车每天行驶的里程数(不是总里程)

以下为脚本

CREATE TABLE [dbo].[CarData](
[CarID] [int] NULL,
[Mileage] [int] NULL,
[M_year] [int] NULL,
[M_Month] [int] NULL,
[M_Day] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 10, 2015, 1, 1)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 15, 2015, 1, 2)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 15, 2015, 1, 5)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 20, 2015, 1, 6)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 26, 2015, 1, 9)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 30, 2015, 1, 10)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (1, 35, 2015, 1, 11)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 20, 2015, 1, 5)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 22, 2015, 1, 8)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 40, 2015, 1, 10)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (2, 45, 2015, 1, 11)
INSERT [dbo].[CarData] ([CarID], [Mileage], [M_year], [M_Month], [M_Day]) VALUES (3, 50, 2015, 1, 11)

解题思路:
--关键点:如何上一条记录,有rowNum之类的函数没?有! row_number()
--按照carID排序后,进行rowNum
SELECT ROW_NUMBER() OVER (order by c.carID ) as rowNum,c.* FROM CarData c

--按照carID分组后
SELECT c.CarID, ROW_NUMBER() OVER (PARTITION by c.CarID ORDER BY c.M_year,c.M_Month,c.M_Day) as RowNum ,c.Mileage FROM CarData c

--博友答案
WITH TWO AS(
SELECT ROW_NUMBER() OVER(PARTITION BY CarId ORDER BY CarId, M_Year, M_Month, M_Day) AS NodeId
,C.CarId
,C.Mileage
,C.M_Year
,C.M_Month
,C.M_Day
FROM cardata AS C
)
SELECT A.*
, A.Mileage - COALESCE(B.NextMileage, 0) AS '增量'
FROM TWO AS A
OUTER APPLY (SELECT Mileage AS NextMileage FROM TWO AS B WHERE B.NodeId = A.NodeId - 1 AND B.CarId = A.CarId ) AS B;

---补充知识 函数COALESCE
--说明 至少应有一个参数为 NULL 类型。,返回第一个非NUll类型的值
select COALESCE(null,null);
SELECT COALESCE(NULL,NULL,GETDATE());
SELECT COALESCE(NULL,0);

SQLServer的学习场景(关于row_number()和COALESCE()的使用)的更多相关文章

  1. SQLServer BI 学习笔记

    MSBI 学习库: https://ask.hellobi.com/blog/biwork SSAS库部署的几种方式 http://www.cnblogs.com/aspnetx/archive/20 ...

  2. GJM :SqlServer语言学习笔记

    ----------------------------SqlServer RDBMS 关系型数据库管理系统 Row/Record 行 Colimn/Attribute 列 Field/Cell 字段 ...

  3. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  4. sqlserver存储过程学习笔记(一)基础知识篇(全)

    说出来有点丢人,做sqlserver应用系统近一年,竟然没有使用过存储过程,现在就好好的梳理一下对应知识,慢慢让其加入到我的项目中去吧. 存储过程的优点:1.运行效率高,提供了在服务器端快速执行sql ...

  5. SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介

    CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...

  6. SqlServer四种排序:ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    首先,我们创建一些测试数据. if OBJECT_ID('Tempdb.dbo.#Tmp') is not null drop table #Tmp create table #Tmp ( name ...

  7. jFinal 2.2入门学习之二:使用sqlserver数据库学习搭建jfinal-demo框架(MySQL的话就不需要看这个了)

    1.去官网下载最新的jfinal_Demo(我这是JFinal-2.2) 2.解压demo源码,eclipse导入项目 3.本地创建数据库,修改信息,(注意:如果sqlserver端口号冲突,需要配置 ...

  8. SQLServer存储过程学习记录

    简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理. 一.存储过程的概述 SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便 ...

  9. sqlserver数据库学习(-)数据类型

    ecimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法:不存储值的近似值. 定义 decimal 的列.变量和参数的 ...

随机推荐

  1. Linux的任务计划--cron入门

    Linux操作系统定时任务系统 Cron 入门 cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动 ...

  2. 使用Gitolite搭建轻量级的Git服务器

    By Harrison Feng在Git服务管理工具这个领域,主要有三种流行的方案,它们分别是 Gitosis - 轻量级, 开源项目,使用SSH公钥认证,只能做到库级的权限控制.目前项目已经停止开发 ...

  3. LayaAir引擎——(十)

    var k = new Array(); var l = new Array(); var m = new Array(); var zhiyeCurosr = 0; function zyinit( ...

  4. UI1_第一天_iOS概述

    iOS:移动操作系统  ------------>ios7.0变化大,倾向于扁平化 UI:用户界面,即各种页面元素 创建工程 Xcode ios -->Application —>模 ...

  5. background-origin和background-clip的区别

    background-origin和background-clip是CSS3内新增加的属性,其实一个是对背景图片的放置,另一个是对背景图片的剪裁. background-origin和backgrou ...

  6. ssh整合--struts

    一 struts(jar+web.xml+struts.xml+Action) 1import min_jars-------struts-2.3.20.3-all(struts2-blank.war ...

  7. C#数据类型分类

    C#是强类型语言,所以在定义每一个变量.常量和对象的时候都必须声明该类型. C#数据类型分为值类型.引用类型和指针类型(指针类型很少用): C#数据类型还可以分为内置类型.匿名类型和自定义类型.

  8. C++ 类知识点

    1. member function definitions are processed after the compiler processes all of the declarations in ...

  9. 使用syncthing进行双机文件同步

    使用syncthing进行双机文件同步 syncthing是一款开源的文件同步软件,可以 syncthing安装 tar -zxvf syncthing-linux-amd64-v0.12.15.ta ...

  10. linux下JDK1.7安装

    http://mnt.conf.blog.163.com/blog/static/115668258201210793915876/ 一.软件下载1.下载JDK(下面分别是32位系统和64位系统下的版 ...