MSSQL 查询统计某状态出现的次数及累计时间
1、问题来源
最近客户需要统计某个设备,某状态,在某一个时间段内出现的次数,并计算累计出现的时间。
数据源如下:
现在如果要统计UPSCTSTA状态为D出现的次数(同一状态,连续出现的认为是一次),并计算累计出现的时间
解决方法
方案1,采用存储过程
CREATE PROCEDURE [dbo].[Proc_UPSState_Statistics]
@Guid VARCHAR(32),
@State VARCHAR(2),
@STime DATETIME,
@ETime DATETIME,
@R_C INT OUTPUT,
@R_S INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT IDENTITY(INT,1,1) AS ID,Guid,UPSCTState,RecordTime INTO #TSTE FROM [dbo].[EUPSDeviceRunRecordLog] WHERE Guid = @Guid AND RecordTime >= @STime AND RecordTime <= @ETime ORDER BY RecordTime
DECLARE @R_Count INT,@RS INT,@State_Count INT --记录总数,累计时长,累计次数
SELECT @RS = 0,@State_Count = 0, @R_S = 0, @R_C = 0 --给统计变量,输出返回值给初始化为0
SELECT @R_Count = COUNT(*) FROM #TSTE
PRINT '符合条件记录:' + STR(@R_Count)
IF(@R_Count < 1) --少于两条记录不预统计
BEGIN
--SELECT @State_Count AS Times,@RS AS Count
PRINT '在指定时间段内未能查询 ' + @Guid + ' 设备的状态 ' + @State + ' 的记录'
END
ELSE BEGIN
DECLARE @I INT --计数器,步长计数器
DECLARE @ST VARCHAR(2) --临时状态
DECLARE @RTime DATETIME,@LTime DATETIME,@DF DATETIME --当前记录的记录时间、最后一次(上条)此状态记录的时间、时间常量
SELECT @DF = '1979-01-01 0:01:01', @LTime = @DF
DECLARE @ST_FLAG INT --符合条件状态记录开始,结果标记,用于统计次数
SELECT @I = 1, @ST_FLAG = 0WHILE(@I <= @R_Count)
BEGIN
SELECT @ST = UPSCTState,@RTime = RecordTime FROM #TSTE WHERE ID = @I
IF(@ST = @State)
IF(@LTime = @DF)
BEGIN
SET @LTime = @RTime
SET @ST_FLAG = 1
END
ELSE
BEGIN
SET @RS = @RS + DATEDIFF(S,@LTime,@RTime)
SET @LTime = @RTime
END
ELSE
BEGIN
SET @LTime = @DF
IF(@ST_FLAG = 1)
BEGIN
SET @State_Count = @State_Count + 1
SET @ST_FLAG = 0
END
END
SET @I = @I + 1
ENDSELECT @R_C = @State_Count,@R_S = @RS
--SELECT @State_Count AS Times, @RS AS Count
END
END执行结果
从1万多条记录中,统计耗时12秒左右.
虽然可以统计出来,但在统计数据较多时,等待的时间可想而知,有没有方法将其优化一下呢?
MSSQL 查询统计某状态出现的次数及累计时间的更多相关文章
- MSSQL·查询T-SQL语句执行时间的三种方法
阅文时长 | 0.23分钟 字数统计 | 420.8字符 主要内容 | 1.引言&背景 2.自定义时间变量求差法 3.MSSQL内置方法 4.MSSQL选项开启时间统计 5.声明与参考资料 『 ...
- mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
在日常mysql运维中,经常要查询当前mysql下正在执行的sql语句及其他在跑的mysql相关线程,这就用到mysql processlist这个命令了.mysql> show process ...
- MSSQL·查询数据库中所有索引的相关信息
阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 ...
- MSSQL·查询存储过程中的关键字
阅文时长 | 0.22分钟 字数统计 | 408字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询存储过程中的关键字』 编写人 | SCscHero 编写时间 | 20 ...
- SQL Server2016 新功能实时查询统计信息
SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...
- Linux 统计某个字符串出现的次数
要统计一个字符串出现的次数,这里现提供自己常用两种方法: 1. 使用vim统计 用vim打开目标文件,在命令模式下,输入 :%s/objStr//gn 即可 2. 使用grep: grep -o ob ...
- ORACLE查询当前资产状态,和另一个数据库联查,(查询重复数据中第一条),子查询作为字段查询
背景:ORACLE查询当前资产状态,包含资产信息(表1),资产维修状态(表2),资产报废状态(表3) 如下: 资产信息:
- Java利用正则表达式统计某个字符串出现的次数
//统计某个字符出现的次数 private void countSubString(){ String string1="香蕉.玉米.面粉"; String string2=&qu ...
- EXCEL中统计单元格内容出现次数
参考网站: https://jingyan.baidu.com/article/7c6fb428dfcc9580642c90ae.html 统计单元格内容出现次数是工作中经常会涉及到的问题. 那么,如 ...
随机推荐
- 教你怎样在ppt2010抠图的小技巧|用ppt2010抠图的方法
我们经常在ppt2010里做幻灯片时会碰到插入的图片并不是我们想要的情况,有的图片只是想要其中的一个部分.我们用“裁剪”功能也是达不到自己想要的效果.有的人会说PS抠图啊,但是比较繁琐,不易懂,不好上 ...
- tomcat jar包加载顺序
加载顺序: 1. $java_home/lib 目录下的java核心api 2. $java_home/lib/ext 目录下的java扩展jar包 3. java -classpath/-Djava ...
- Python三元表达式
我们知道Python没有三元表达式,但是我们通过技巧达到三元表达式的效果. 摘自<Dive Into Python>: 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的 ...
- [转载] $\mathrm{Jordan}$标准型的介绍
本文转载自陈洪葛的博客$,$ 而实际上来自xida博客朝花夕拾$,$ 可惜该博客已经失效 $\mathrm{Jordan}$ 标准形定理是线性代数中的基本定理$,$ 专门为它写一篇长文好像有点多余$: ...
- MCU助推居家移动医疗微型化
随着行动装置的快速普及,近几年行动医疗成为热门话题,市场成长迅速,也引发了不少新的商业模式.根据美通社一份市场调查报告指出,行动医疗市场在2018年将达到234.9亿美元的规模,2013至2018年期 ...
- Ftp的断点下载实现
思路:首先获取本地临时文件的大小,在通过FTp的REST命令获取远程文件的偏移,然后再RETR命令在偏移处下载.while循环对比本地文件和远程文件的字节大小,如此 不断的反复以上过程,直到远程文件字 ...
- 设计模式(六):Singleton 单件模式 -- 创建型模式
1.定义 当需要控制一个类的实例数量且调用者可以从一个公共的访问点访问时. 2.适用场景 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 2. 当这个唯一实例应该是通过子类化可扩 ...
- AOJ 0558 广度优先搜索
题意:在 H * W 的地图里有 N 个工厂,每个工厂分别生产硬度为1-N 的奶酪,有一只老鼠准备把所有奶酪都吃完.老鼠的初始体力值为1,每吃一个奶酪体力值加 1.已知老鼠不能吃硬度大于当前体力值的奶 ...
- js跨域问题新方案
只要创建一个空图片. js代码: var data = "http://localhost:8080/test?id="+id+"&content="+ ...
- powershell利用winform批量执行tsql语句
#加载.net的winform模块 [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $app= ...