表A:
ID  D_NAME       D_DATE           TEMP    HUM
632 一号设备   2011-05-09 01:00:00.000  24 71
702 一号设备   2011-05-09 02:00:00.000  24 64
772 一号设备   2011-05-09 03:00:00.000  24 64
842 一号设备   2011-05-09 04:00:00.000  24 64
......
633 二号设备   2011-05-09 01:00:00.000  16 64
703 二号设备   2011-05-09 02:00:00.000  21 72
773 二号设备   2011-05-09 03:00:00.000  17 64
843 二号设备   2011-05-09 04:00:00.000  17 64
......
631 三号设备   2011-05-09 01:00:00.000  17 64
701 三号设备   2011-05-09 02:00:00.000  18 64
771 三号设备   2011-05-09 03:00:00.000  27 64
841 三号设备   2011-05-09 04:00:00.000  18 64
......每天每小时表A会记录各个设备的TEMP值和HUM值,TEMP和HUM值都有一个范围(TEMP最高20,HUM最高70),现在要求查询每个设备的TEMP值和HUM值是否正常。如果超过正常范围,将第一个出现的超标的数值修改为接近20的一个数值,其它的超标记录修改为正常范围内。求教该SQL语句该怎么写啊,是否要用到游标?没怎么接触过游标:(

解决方案 »

  1.   

    接近20的一個數值﹐我理解為大于20﹐并小于25﹐呵呵。
    update A set TEMP = 20 + 5 * rand()
    from A, (select ID, MAX(D_DATE) AS D_DATE from a where TEMP > 20 GROUP BY ID) B
    where a.id = b.id
    其它修改為正常范圍
    update A set TEMP = 20 * rand() where TEMP > 20HUM也是同樣處理。
      

  2.   

    update A set TEMP = 20 + 5 * rand()
    WHere Not exists(Select 1 From A s Where s.D_NAME=a.D_NAME And s.D_Date>A.D_Date And s.Temp>20)
    And Temp>20--try
      

  3.   


    update A set TEMP = 20 + 5 * rand()
    WHere Not exists(Select 1 From A s Where s.D_NAME=a.D_NAME And s.D_Date>A.D_Date And s.Temp>20)
    --try 这样估计也可以,如果D_Name和D_Date不重复的话
      

  4.   

    update A set TEMP = 20 + 5 * rand()
    WHere Not exists(Select 1 From A s Where s.D_NAME=a.D_NAME And s.D_Date>A.D_Date And s.Temp>20)
      

  5.   

    update
     A set TEMP = 20 + 5 * rand()
    WHere
     Not exists(Select 1 From A s Where s.D_NAME=a.D_NAME And s.D_Date>A.D_Date And s.Temp>20)
      

  6.   

    --找出当天第一个出现的超标数值的记录
    select min(id) from A where TEMP>20 or HUM>70 group by convert(varchar(100),D_DATE,23)
    --把其它的超标记录修改为正常范围内
    update A set TEMP=20,HUM=70 where (TEMP>20 or HUM>70) 
    and id not in (select min(id) from A where TEMP>20 or HUM>70 group by convert(varchar(100),D_DATE,23))
    --当天第一个出现的超标数值的记录改为接近20的一个数值
    update A set TEMP=20+5*rand(),HUM=70+5*rand() 
    where id in (select min(id) from A where TEMP>20 or HUM>70 group by convert(varchar(100),D_DATE,23))
      

  7.   

    其它超标记录改为正常范围内,用你们说的方法的话,所有记录的TEMP值只能改为相同的一个随机数,我需要将超标的每条记录的TEMP值分别取一个随机数。
      

  8.   


    改下最后一个语句的话就可以每条记录的TEMP值分别取一个随机数。
    update A set TEMP=20+abs(checksum(newid()))%6,HUM=70+abs(checksum(newid()))%6 
    where id in (select min(id) from A where TEMP>20 or HUM>70 group by convert(varchar(100),D_DATE,23))