日期:2014-05-17  浏览次数:20733 次

控制写入数据问题
每天要执行作业从底层采上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





------解决方案--------------------
SQL code
--> 测试数据:[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 ALL
SELECT '2012-9-30 21:00',110,430 UNION ALL
SELECT '2012-9-30 22:00',120,440 UNION ALL
SELECT '2012-9-30 23:00',142,445 UNION ALL
SELECT '2012-10-1 00:00',210,449 UNION ALL
SELECT '2012-10-1 1:00:00',200,500 UNION ALL
SELECT '2012-10-1 2:00:00',300,200 UNION ALL
SELECT '2012-10-1 3:00:00',345,550 UNION ALL
SELECT '2012-10-1 4:00:00',352,0 UNION ALL
SELECT '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    420
2012-09-30 21:00:00.000    110    430
2012-09-30 22:00:00.000    120    440
2012-09-30 23:00:00.000    142    445
2012-10-01 00:00:00.000    210    449
2012-10-01 01:00:00.000    210    500
2012-10-01 02:00:00.000    300    500
2012-10-01 03:00:00.000    345    550
2012-10-01 04:00:00.000    352    550
2012-10-01 05:00:00.000    352    610
*/