SQL server 实战篇(三)利用游标统计异常数据

USE [Data Inspection]
GO
/****** Object:  StoredProcedure [dbo].[DOAS_data_processing]    Script Date: 2018/8/4 15:11:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[DOAS_data_processing]
@startime datetime,
@endtime datetime,
@Base_StationInfo_ID int,       -- 站房ID
@Base_InstrumentInfo_ID int     -- 设备ID
as 
begin


--DOAS 异常统计过程

Declare
@UpStartTime datetime,
@UpEndTime  datetime,
@name varchar(30),
@stationName varchar(30),
@colName   varchar(10),
@startValue numeric(10,3),                 --预警阈值表里的小值
@endValue numeric(10,3),                   --预警阈值表里的大值
@grade varchar(20),                --
@type int,                         --因子预警阈值类型(0安全,1,类比)
@windDirection varchar(20),        --本周最高浓度对应的风向
@DateTime datetime,                --本周最高浓度对应的时间
@Concentration numeric(10,3),      --本周最高浓度
@lastconcentration numeric(10,3),  --上周最高浓度
@CountSQL nvarchar(MAX),
@CountValue int,   --统计是否有异常因子
@CountValue1 int,   --统计白天异常因子数目
@CountValue2 int   --统计夜晚异常因子数目

SET @UpStartTime = DATEADD(HOUR,12,@startime)
SET @UpEndTime = DATEADD(HOUR,12,@endtime)

declare cur_DOAS cursor for 
    select name,startValue,endValue,grade  from warningDoasValue where Base_InstrumentInfo_ID = @Base_InstrumentInfo_ID 

open cur_DOAS
fetch next from cur_DOAS into @name,@startvalue,@endvalue,@grade
--预警阈值分为全天,白天和夜晚的,要根据不同的@type值进行统计,当游标遍历不同类型时,统计的时间段也不一样



while @@FETCH_STATUS = 0
    begin 
        SET @CountSQL =N' SELECT @countsum = COUNT(*) FROM DOAS_original_data_temp where monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between @SUpStartTime and @Sendtime and repairValue between @SstartValue and @SendValue' 
        exec sp_executesql @CountSQL,
        @params = N'@Sname varchar(30), @SBase_InstrumentInfo_ID int,@SUpStartTime datetime,@Sendtime datetime,@SstartValue numeric(10,3),@SendValue numeric(10,3),@countsum numeric(10,3) output',
        @Sname  = @name,
        @SBase_InstrumentInfo_ID = @Base_InstrumentInfo_ID,
        @SUpStartTime = @UpStartTime,
        @Sendtime = @UpEndTime,
        @SstartValue = @startValue,
        @SendValue = @endValue,
        @countsum = @CountValue output


        IF @CountValue > 0 
            begin
                set @CountSQL = N'select  @countsum1 = COUNT(*) FROM DOAS_original_data_temp where monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between @SUpStartTime and @Sendtime and repairValue between @SstartValue and @SendValue AND DATEPART(HOUR,reporttime) in (8,9,10,11,12,13,14,15,16,17,18,19);
                                  select  @countsum2 = COUNT(*) from DOAS_original_data_temp where monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between @SUpStartTime and @Sendtime and repairValue between @SstartValue and @SendValue AND DATEPART(HOUR,reporttime) in (20,21,22,23,0,1,2,3,4,5,6,7)'

                exec sp_executesql @countsql,
                @params = N'@Sname VARCHAR(30), @SBase_InstrumentInfo_ID int,@SUpStartTime datetime,@Sendtime datetime,@SstartValue numeric(10,3),@SendValue numeric(10,3),@countsum1 numeric(10,3) output,@countsum2 numeric(10,3) output',
                @Sname  = @name,
                @SBase_InstrumentInfo_ID = @Base_InstrumentInfo_ID,
                @SUpStartTime = @UpStartTime,
                @Sendtime = @UpEndTime,
                @SstartValue = @startValue,
                @SendValue = @endValue,
                @countsum1 = @CountValue1 output,
                @countsum2 = @CountValue2  output   

                --本天最高浓度/站点名称、时间、风速、风向
                set @CountSQL = N'select @SConcentration = repairValue,@STATION = stationname,@Sdatetime = reportTime,@Swind = windDirectionExplain  from DOAS_original_data_temp WHERE monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between @SUpStartTime and @Sendtime and repairvalue =(select MAX(repairValue) from DOAS_original_data_temp WHERE monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between @SUpStartTime and @Sendtime)'
                EXEC sp_executesql @countsql,
                    @params = N'@Sname varchar(30), @SBase_InstrumentInfo_ID int,@SUpStartTime datetime,@Sendtime datetime,@SConcentration numeric(10,3) output,@Sdatetime datetime output,@Swind varchar(20) output,@STATION varchar(30) output',
                    @Sname  = @name,
                    @SBase_InstrumentInfo_ID = @Base_InstrumentInfo_ID,
                    @SUpStartTime = @UpStartTime,
                    @Sendtime = @UpEndTime,
                    @SConcentration  = @Concentration output,
                    @Sdatetime = @DateTime output,
                    @Swind = @windDirection output,
                    @STATION = @stationName output




              -- 昨天最高浓度
                set @CountSQL = N'select @LConcentration = repairValue from DOAS_original_data WHERE area = @area and  monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between dateadd(day,-1,@SUpStartTime) and dateadd(day,-1,@Sendtime)  and repairvalue = (select MAX(repairValue) from DOAS_original_data WHERE monitorName = @Sname and stationID = @SBase_InstrumentInfo_ID and reportTime between dateadd(day,-1,@SUpStartTime) and dateadd(day,-1,@Sendtime))'
                EXEC sp_executesql @countsql,
                    @params = N'@area int,@Sname varchar(30), @SBase_InstrumentInfo_ID int,@SUpStartTime datetime,@Sendtime datetime,@LConcentration numeric(10,3) output',
                    @area = @Base_StationInfo_ID,
                    @Sname  = @name,
                    @SBase_InstrumentInfo_ID = @Base_InstrumentInfo_ID,
                    @SUpStartTime = @UpStartTime,
                    @Sendtime = @UpEndTime,
                    @LConcentration  = @lastconcentration output

                insert into excess values(NEWID(),@Base_StationInfo_ID,@stationName,'DOAS',@name,'站点预警阈值-静态',@grade,@startValue,@endValue,@CountValue,@CountValue1,@CountValue2,@DateTime,@Concentration,@lastconcentration,@windDirection)

            end
        fetch next from cur_DOAS into @name,@startvalue,@endvalue,@grade
    end
close cur_DOAS
DEALLOCATE cur_DOAS

insert into DOAS_original_data([id],[stationID],[stationName],[devicesID],[devicesName],[monitorID],[monitorName],[belongDevices],[reportTime],[originalData],[repairValue],[unitID],[unit],[siteID],[itemID],[weatherReportTime],[temperature],[tempExplain],[humidity],[humidityExplain],[windDirection],[windDirectionExplain],[windSpeed],[windSpeedExplain]) 
                        select [id],[stationID],[stationName],[devicesID],[devicesName],[monitorID],[monitorName],[belongDevices],[reportTime],[originalData],[repairValue],[unitID],[unit],[siteID],[itemID],[weatherReportTime],[temperature],[tempExplain],[humidity],[humidityExplain],[windDirection],[windDirectionExplain],[windSpeed],[windSpeedExplain]  from DOAS_original_data_temp

update DOAS_original_data set area = @Base_StationInfo_ID where area is null

END
--exec DOAS_data_processing '2018-06-19','2018-06-20',1,2

猜你喜欢

转载自blog.csdn.net/qq_39001049/article/details/81411290