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 = 0

WHILE(@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
            END

SELECT @R_C = @State_Count,@R_S = @RS
         --SELECT @State_Count AS Times, @RS AS Count
    END
END

执行结果

从1万多条记录中,统计耗时12秒左右.

虽然可以统计出来,但在统计数据较多时,等待的时间可想而知,有没有方法将其优化一下呢?

MSSQL 查询统计某状态出现的次数及累计时间的更多相关文章

  1. MSSQL·查询T-SQL语句执行时间的三种方法

    阅文时长 | 0.23分钟 字数统计 | 420.8字符 主要内容 | 1.引言&背景 2.自定义时间变量求差法 3.MSSQL内置方法 4.MSSQL选项开启时间统计 5.声明与参考资料 『 ...

  2. mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明

    在日常mysql运维中,经常要查询当前mysql下正在执行的sql语句及其他在跑的mysql相关线程,这就用到mysql processlist这个命令了.mysql> show process ...

  3. MSSQL·查询数据库中所有索引的相关信息

    阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 ...

  4. MSSQL·查询存储过程中的关键字

    阅文时长 | 0.22分钟 字数统计 | 408字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询存储过程中的关键字』 编写人 | SCscHero 编写时间 | 20 ...

  5. SQL Server2016 新功能实时查询统计信息

    SQL Server2016 新功能实时查询统计信息 很多时候有这样的场景,开发抱怨DBA没有调优好数据库,DBA抱怨开发写的程序代码差,因此,DBA和开发都成为了死对头,无法真正排查问题. DBA只 ...

  6. Linux 统计某个字符串出现的次数

    要统计一个字符串出现的次数,这里现提供自己常用两种方法: 1. 使用vim统计 用vim打开目标文件,在命令模式下,输入 :%s/objStr//gn 即可 2. 使用grep: grep -o ob ...

  7. ORACLE查询当前资产状态,和另一个数据库联查,(查询重复数据中第一条),子查询作为字段查询

    背景:ORACLE查询当前资产状态,包含资产信息(表1),资产维修状态(表2),资产报废状态(表3) 如下: 资产信息:

  8. Java利用正则表达式统计某个字符串出现的次数

    //统计某个字符出现的次数 private void countSubString(){ String string1="香蕉.玉米.面粉"; String string2=&qu ...

  9. EXCEL中统计单元格内容出现次数

    参考网站: https://jingyan.baidu.com/article/7c6fb428dfcc9580642c90ae.html 统计单元格内容出现次数是工作中经常会涉及到的问题. 那么,如 ...

随机推荐

  1. apache静态文件配置

    开发环境配置 需要下面几个步骤 1. 在app目录下创建static目录,将静态文件和相关文件夹放到此目录下,如your_app/static/img等 2. 确保settings.py中的INSTA ...

  2. Codeforces 301_div.2_Ice Cave(BFS走冰块)

    Ice Cave Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Descripti ...

  3. asp.net framework identity 学习笔记

    关于 cookie expiry & securityStamp http://www.jamessturtevant.com/posts/ASPNET-Identity-Cookie-Aut ...

  4. 突然间,对JAVA也找到点感觉了。

    书上没有那段代码,我自己修修补补弄完全了呢.... 就是感觉体系有点宏大,不要急,慢慢玩~!~~ 这个世界很精彩哟~~: QuizCard.java package QuizCard.sky.com; ...

  5. 调用API函数,在窗口非客户区绘图(通过GetWindowDC获得整个窗口的DC,就可以随意作画了)

    http://hi.baidu.com/3582077/item/77d3c1ff60f9fa5ec9f33754 调用API函数,在窗口非客户区绘图 GDI+的Graphics类里有个FromHdc ...

  6. 开发者应该避免使用的6个Java功能(转)

    本文作者是一名拥有多年Java开发经验的程序员,他从经验中得出,并不是所有的Java SE功能/API都值得程序员去使用,比如本文列举的这6个,大家在使用前得慎重对待.以下是对原文的摘译. 多年的Ja ...

  7. POJ3267 The Cow Lexicon(dp)

    题目链接. 分析: dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数. dp[i] = min(dp[i+res]+res-strlen(pa[j])); 其中res 为从第 i 位开始匹配 ...

  8. NOIP

    最近把历年题刷一下吧... 发现0几年的题不是爆搜就是高精度,恶心死了...直接跳过,做些有意思的... P1129产生数 floyed之后乘法原理统计   P1810导弹拦截 贪心,按距某个点的距离 ...

  9. C语言---递归反向输出任意长度的字符串

    (该字符串可以包含空格和回车!) [题目要求] 编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能. 例如输入字符串:ABCD,输出字符串:DCBA. [题目分析] 应用递归的思想有时可以很 ...

  10. Nodejs in Visual Studio Code 04.Swig模版

    1.开始 设置Node_Global:npm config set prefix "C:\Program Files\nodejs" Express组件:npm install e ...