用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据

问题描述

用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据

我有一张表,里面3字段id、time、value.
由于value中的部分值异常的大,我想批量修改数据,比如说4.1日-4.20日出现中出现异常大的数据,我想把异常大的数据修改成和他时间段(时间段前或者后)差不多的数据,请问下这个sql应该怎么写啊。我用游标的方法怎么实现。谢谢啊!

解决方案

不知道你的数据库是什么,用MS SQL SERVER示意

建表SQL如下

CREATE TABLE t1
(
  [id] INT IDENTITY(1,1) PRIMARY KEY,
  [time] DATETIME,
  [value] INTEGER
)

初始数据SQL如下

INSERT INTO t1
SELECT '2015-4-24 10:00',100
UNION ALL
SELECT '2015-4-24 11:00',200
UNION ALL
SELECT '2015-4-24 12:00',10000
UNION ALL
SELECT '2015-4-24 13:00',150
UNION ALL
SELECT '2015-4-25 12:00',150
UNION ALL
SELECT '2015-4-25 13:00',150
UNION ALL
SELECT GETDATE(),100

要实现的目标SQL如下

UPDATE t1
   SET [value]=t0.[v]
  FROM (SELECT dateadd(d,datediff(d,t11.[time],'1900-1-1'),'1900-1-1') tm,avg(t11.[value]) [v]
          FROM t1 t11
         WHERE t11.value <=1000
         GROUP BY dateadd(d,datediff(d,t11.[time],'1900-1-1'),'1900-1-1')) t0,t1
 WHERE t1.[value] > 1000
   AND dateadd(d,datediff(d,t1.[time],'1900-1-1'),'1900-1-1') = t0.tm

不知是否和你的情况类似

解决方案二:

修正一下,第三个SQL

UPDATE t1
   SET [value]=t0.[v]
  FROM (SELECT dateadd(d,datediff(d,'1900-1-1',t11.[time]),'1900-1-1') tm,avg(t11.[value]) [v]
          FROM t1 t11
         WHERE t11.value <=1000
         GROUP BY dateadd(d,datediff(d,'1900-1-1',t11.[time]),'1900-1-1')) t0,t1
 WHERE t1.[value] > 1000
   AND dateadd(d,datediff(d,'1900-1-1',t1.[time]),'1900-1-1') = t0.tm

时间: 2024-08-02 18:08:41

用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据的相关文章

Sql语句把一个表的某几列的数据存到另一个表里的方法

原文地址:sql语句把一个表的某几列的数据存到另一个表里的方法作者:星星月亮 一.如何用slq语句把一个表中的某几个字段的数据插入到另一个新表中,就要用下面这条slq语句:     insert into 表名1(字段1,字段2) select 字段1,字段2 from 表名2 这里有一点值得注意的是这2个字段要一一对应,并且按顺序. 二.如果另一个表是已经有数据的表,只希望更改其中的一列或几列的话,则用下面的sql语句:    update 表名1,表名2 set 表名1.字段1 = 表名2.

怎么用sql语句取一个整数的后两位

问题描述 怎么用sql语句取一个整数的后两位 我想取一个数的后两位,比如12345678,我只想要78 这两个,各位有没有哦什么办法... 解决方案 居然有人用right,真是来坑lz的吧 这个很简单, select num % 100就可以了 也就是整除100取余数 解决方案二: select mod(col,100) from test; 解决方案三: substring(col,6,2) 解决方案四: 楼上的方法都可以解决,但是直接取余数的是最方便的.. 解决方案五: select rig

着急实现-下面的SQL语句怎么解释,详细点,求大神赐教,急急急急急急!!!!!

问题描述 下面的SQL语句怎么解释,详细点,求大神赐教,急急急急急急!!!!! select convert(varchar(2),采集时间,108),count(1) from 监测执行表 (nolock) where 采集时间 > convert(varchar(10),getdate(),120) group by convert(varchar(2),采集时间,108) order by 1 解决方案 采集时间 是今天的,按小时统计数量http://www.w3school.com.cn

存储过程与SQL语句的一个故事

存储过程|语句     我的一位朋友说:他从台湾知名技术作家李维先生的一本书中获悉,如果用存储过程封装SQL语句,系统效率将有极大提升.    他做过实验!!! --我相信朋友做过实验,尽管非亲眼所见.不过我估计他的实验有问题,那样的实验不但蒙蔽了他,也蒙蔽了李维先生(如果他的著作中的内容没有被误会),甚至更多的人.    然而我必须拿出证据,方能使人信服.    后来遇到一个具体的问题:客户端经常要向数据库插入记录.在J2EE中,一个 Entity Bean Home 的 create 方法调

用SQL语句获得一个存储过程返回的表

定义一个存储过程如下: create proc [dbo].[test1]@id intasselect 1 as id,'abc' as name union all select @id as id,'zzz' as name 返回两行数据.现在想用SQL语句来调用这个存储过程,并把他返回的表放入变量中.可以如下做: declare   @table   table(id   int,name varchar(50))--定义表变量来存放存储过程返回的内容insert  into @tabl

sql语句-请教一个SQL语句如何写?

问题描述 请教一个SQL语句如何写? 求助大侠:表A中有字段a,b,c,d,e,f,但并不是所有字段都一定有值,其中有值字段原值为'201xxxx'现在要将有值字段由'201xxxx'替换为'2001xxxx',无值字段保留为空,请问SQL语句如何写?(其中'201xxxx'中的xxxx代表数字,比如20101或201010101,位数不定,也可能只为201)请赐教. 解决方案 update [A] set [a] = left(a2)+'0'+right(alen(a)-2) [b] = le

[20120327]toad与sqlplus下执行sql语句的一个细节.txt

TOAD是一个很好的图形化oracle管理工具,昨天在解决一个问题时遇到了一些细节问题,实际上我以前就知道,现在把它写下来: 我使用toad版本是9.6.0.27. 1.在sqlplus下执行如下: SQL> select /*+ zzzz */ * from dept where deptno=10;     DEPTNO DNAME          LOC ---------- -------------- -------------         10 ACCOUNTING     N

在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名_MsSql

这个问题对于规模稍微大些的项目而言,显得尤其重要了,数据库中如果有几百个存储过程, 难道还一个个找不成,即使自己很了解业务和系统,时间长了,也难免能记得住. 如何使用SQL语句进行查询呢? 下面就和大家分享下SQL查询的方法: 复制代码 代码如下: select distinct name from syscomments a,sysobjects b where a.id=b.id and b.xtype='p' and text like '%pro_GetSN%' 上面的蓝色字体部分表示要

怎样用SQL语句查询一个数据库中的所有表?

SQL  SERVER:  select * from information_schema.tables ORACLE: select table_name from user_tables  ACCESS: select    name    from    MSysObjects    where    type=1    and    flags=0