USE [Data Inspection]
GO
/****** Object: StoredProcedure [dbo].[FTIR_data_processing] Script Date: 2018/8/4 15:07:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[FTIR_data_processing]
@startime datetime,
@endtime datetime,
@Base_StationInfo_ID int,-- 站房ID
@Base_InstrumentInfo_ID int-- 设备ID
as
begin
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, --统计夜晚异常因子数目
@lowerValue numeric(10,3), --预警阈值的范围区间值,小值
@upperValue numeric(10,3), --预警阈值的范围区间值,大值
@Mtype varchar(10) --物质类型
SET @UpStartTime = DATEADD(HOUR,12,@startime)
SET @UpEndTime = DATEADD(HOUR,12,@endtime)
declare cur_FTIR cursor for
select name,startValue,endValue,grade,type from warningStaticValue where Base_StationInfo_ID = @Base_StationInfo_ID and Base_InstrumentInfo_ID = @Base_InstrumentInfo_ID
open cur_FTIR
fetch next from cur_FTIR into @name,@startvalue,@endvalue,@grade,@type
--预警阈值分为全天,白天和夜晚的,要根据不同的@type值进行统计,当游标遍历不同类型时,统计的时间段也不一样
while @@FETCH_STATUS = 0
begin
--全天的超标统计
if @type = 0 or @type = 3
begin
set @CountSQL = N'select @countsum = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime'
EXEC SP_EXECUTESQL @COUNTSQL,
@PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
@Sname = @name,
@ustarttime = @UpStartTime,
@uendtime = @UpEndTime,
@instument = @Base_InstrumentInfo_ID,
@sstartvalue = @startValue,
@sendvalue = @endValue,
@countsum = @CountValue output
end
--白天的阈值超标统计
if @type = 1
begin
set @CountSQL = N'select @countsum = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (8,9,10,11,12,13,14,15,16,17,18,19)'
EXEC SP_EXECUTESQL @COUNTSQL,
@PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
@Sname = @name,
@ustarttime = @UpStartTime,
@uendtime = @UpEndTime,
@instument = @Base_InstrumentInfo_ID,
@sstartvalue = @startValue,
@sendvalue = @endValue,
@countsum = @CountValue output
end
--夜晚阈值超标统计
if @type = 2
begin
set @CountSQL = N'select @countsum = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (20,21,22,23,0,1,2,3,4,5,6,7)'
EXEC SP_EXECUTESQL @COUNTSQL,
@PARAMS = N'@ustarttime datetime,@uendtime datetime,@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output ' ,
@Sname = @name,
@ustarttime = @UpStartTime,
@uendtime = @UpEndTime,
@instument = @Base_InstrumentInfo_ID,
@sstartvalue = @startValue,
@sendvalue = @endValue,
@countsum = @CountValue output
end
--如果有超标的情况及@countvalue > 0 时,统计总超标量即@countvalue,白天超标量和夜晚超标量
if @CountValue > 0
begin
if @type = 0 or @type = 3
set @CountSQL = N'select @countsum = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and DATEPART(HOUR,reporttime)in (8,9,10,11,12,13,14,15,16,17,18,19) and repairvalue > @sstartvalue and repairvalue < @sendvalue;
select @countsum1 = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname AND DATEPART(HOUR,reporttime)in (20,21,22,23,0,1,2,3,4,5,6,7) and repairvalue > @sstartvalue and repairvalue < @sendvalue'
if @type = 1
set @CountSQL = N'select @countsum = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname and repairvalue > @sstartvalue and repairvalue < @sendvalue and reporttime between @ustarttime and @uendtime and datepart(hour,reporttime) in (8,9,10,11,12,13,14,15,16,17,18,19);
select @countsum1 =0'
if @type = 2
set @CountSQL = N'select @countsum = 0;
select @countsum1 = count(*) from FTIR_original_data_temp where stationID = @instument AND monitorName = @Sname AND DATEPART(HOUR,reporttime)in (20,21,22,23,0,1,2,3,4,5,6,7) and repairvalue > @sstartvalue and repairvalue < @sendvalue'
exec sp_executesql @countsql,
@PARAMS = N'@instument int,@Sname varchar(30),@sstartvalue numeric(10,3), @sendvalue numeric(10,3),@Countsum Numeric(10,4) output,@Countsum1 Numeric(10,4) output ' ,
@Sname = @name,
@instument = @Base_InstrumentInfo_ID,
@sstartvalue = @startValue,
@sendvalue = @endValue,
@countsum = @CountValue1 output,
@countsum1 = @CountValue2 output
--本天最高浓度/时间/风速/风向
set @CountSQL = N'select @mConcentration = repairValue,@STATION = stationname ,@Sdatetime = reportTime,@Swind = windDirectionExplain from FTIR_original_data_temp where stationID = @instument and monitorName = @Sname and reportTime between @SUPstarttime and @Supendtime and repairValue = (select max(repairValue) from FTIR_original_data_temp where stationID = @instument and monitorName = @Sname and reportTime between @SUPstarttime and @Supendtime)'
exec sp_executesql @countsql,
@params =N'@instument int,@Sname varchar(30),@sUPstarttime datetime,@Supendtime datetime,@mConcentration numeric(10,3) output,@Sdatetime datetime output,@Swind varchar(20) output,@STATION varchar(30) output',
@Sname = @name,
@instument = @Base_InstrumentInfo_ID,
@sUPstarttime = @UpStartTime,
@Supendtime = @UpEndTime,
@mConcentration = @Concentration output,
@Sdatetime = @DateTime output,
@Swind = @windDirection output,
@STATION = @stationName output
--昨天最高浓度
set @CountSQL = N'select @lConcentration = max(repairValue) from FTIR_original_data where area = @area and stationID = @instument and monitorName = @Sname and reportTime between dateadd(day,-1,@SUPstarttime) and dateadd(day,-1,@Supendtime)'
exec sp_executesql @countsql,
@params =N'@area int,@instument int,@Sname varchar(30),@sUPstarttime datetime,@Supendtime datetime,@lConcentration numeric(10,3) output',
@area = @Base_StationInfo_ID,
@Sname = @name,
@instument = @Base_InstrumentInfo_ID,
@sUPstarttime = @UpStartTime,
@Supendtime = @UpEndTime,
@lConcentration = @lastconcentration output
--将本存储过程中获取的各变量的值插入到表excess中
insert into excess values(NEWID(),@Base_StationInfo_ID,@stationName,'FTIR',@name,'站点预警阈值-静态',@grade,@startValue,@endValue, @CountValue,@CountValue1,@CountValue2,@DateTime,@Concentration,@lastconcentration,@windDirection)
end
fetch next from cur_FTIR into @name,@startvalue,@endvalue,@grade,@type
end
CLOSE CUR_ftir
deallocate cur_ftir
insert into FTIR_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 FTIR_original_data_temp
update FTIR_original_data set area = @Base_StationInfo_ID WHERE AREA IS NULL;
end
SQL server实战篇(二)利用游标进行数据统计
猜你喜欢
转载自blog.csdn.net/qq_39001049/article/details/81411255
今日推荐
周排行