控制写入数据问题
每天要执行作业从底层采上24个数据(每小时一次),数据为递增数据,存放在一个临时表中,再把临时表的数据插入到基础数据表里,后面的操作要在采集完以后进行
临时表:
时间 设备1 设备2 。。。。。
2012-10-1 1:00:00 200 500
2012-10-1 2:00:00 300 200
2012-10-1 3:00:00 345 550
2012-10-1 4:00:00 352 0
2012-10-1 5:00:00 160 610
。
。
。
。
底层采数的时候会遇到问题,所以会出现设备1在1点和5点,设备2在2点和4点的时候出现数值变小或为0的问题,要将这个读取上来的临时表里面的数据插入到基础数据表当中
基础数据表:
时间 设备1 设备2 。。。。。
。
。
。
2012-9-30 20:00:00 100 420
2012-9-30 21:00:00 110 430
2012-9-30 22:00:00 120 440
2012-9-30 23:00:00 142 445
2012-9-30 24:00:00 210 449
插入时,所有出现变小或为0的数据都要以上一个时间点的数据为准
由于临时表第一行的数据也有可能是错误的,所以要与基础表的最后一行数据进行比较,如果数据临时表的数据小于上一行的数据,则以上一个数据的数值为准
最后要得到的是:
基础数据表:
时间 设备1 设备2 。。。。。
。
。
。
2012-9-30 20:00:00 100 420
2012-9-30 21:00:00 110 430
2012-9-30 22:00:00 120 440
2012-9-30 23:00:00 142 445
2012-9-30 24:00:00 210 449
2012-10-1 1:00:00 210 500
2012-10-1 2:00:00 300 500
2012-10-1 3:00:00 345 550
2012-10-1 4:00:00 352 550
2012-10-1 5:00:00 352 610
。
。
。
。
[解决办法]
--> 测试数据:[tb]IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]GO CREATE TABLE [tb]([时间] DATETIME,[设备1] VARCHAR(7),[设备2] INT)INSERT [tb]SELECT '2012-9-30 20:00',100,420 UNION ALLSELECT '2012-9-30 21:00',110,430 UNION ALLSELECT '2012-9-30 22:00',120,440 UNION ALLSELECT '2012-9-30 23:00',142,445 UNION ALLSELECT '2012-10-1 00:00',210,449 UNION ALLSELECT '2012-10-1 1:00:00',200,500 UNION ALLSELECT '2012-10-1 2:00:00',300,200 UNION ALLSELECT '2012-10-1 3:00:00',345,550 UNION ALLSELECT '2012-10-1 4:00:00',352,0 UNION ALLSELECT '2012-10-1 5:00:00',160,610--------------开始查询--------------------------SELECT [时间],CASE WHEN [设备1]<(SELECT [设备1] FROM [tb] WHERE [时间]=DATEADD(hh,-1,t.[时间])) THEN (SELECT [设备1] FROM [tb] WHERE [时间]=DATEADD(hh,-1,t.[时间])) ELSE [设备1] END ,CASE WHEN [设备2]<(SELECT [设备2] FROM [tb] WHERE [时间]=DATEADD(hh,-1,t.[时间])) THEN (SELECT [设备2] FROM [tb] WHERE [时间]=DATEADD(hh,-1,t.[时间])) ELSE [设备2] END FROM [tb] AS t----------------结果----------------------------/* 时间 (无列名) (无列名)2012-09-30 20:00:00.000 100 4202012-09-30 21:00:00.000 110 4302012-09-30 22:00:00.000 120 4402012-09-30 23:00:00.000 142 4452012-10-01 00:00:00.000 210 4492012-10-01 01:00:00.000 210 5002012-10-01 02:00:00.000 300 5002012-10-01 03:00:00.000 345 5502012-10-01 04:00:00.000 352 5502012-10-01 05:00:00.000 352 610*/