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
SQL server 实战篇(三)利用游标统计异常数据
猜你喜欢
转载自blog.csdn.net/qq_39001049/article/details/81411290
今日推荐
周排行