sql语句 同一时间出现2条数据,对比其中某一字段,删除其中较小的一条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句 同一时间出现2条数据,对比其中某一字段,删除其中较小的一条相关的知识,希望对你有一定的参考价值。

时间 a b c
2013/1/17 22:10:02 13 57 310
2013/1/17 22:10:02 13 57 178
例如:
当a=13,b=57,同一时间出现2条数据,删除c字段较小的一条数据

求帮忙

参考技术A delete from table where c in (select min(c) from table where a='13' and b='57')
这样就可以取两条数据 最小的数据进行删除!追问

你这也没有判断同一时间啊

追答

delete from table where c in (
select min(c) from table where time in (
select time from table where a='13' and b='57' group by time having COUNT (time)>1))
这样就可以删除时间是一样而且有两条满足 a='13' and b='57'的数据。删除C值最小的那一条。看是否OK~!

追问

错误You can't specify target table 'zr_controllercurrentvalue' for update in FROM clause。
三个from table 都是我表名是吗?

追答

是啊 ~!table是表名啊 ~!

追问

还是不行,方便qq说话吗

追答

我 在 公司的。上不了,我实验过的。可以按照你的要求删除数据。
delete from 表 where c in (
select min(c) from 表 where 时间 in (
select 时间 from 表 where a='13' and b='57' group by 时间 having COUNT (时间)>1))

table是你的表名, ABC是字段名字,我里面的time是你的 时间 字段
原理很简单 ,就是先统计出出现时间一样而且大于两条的数据,进行比对找出最小值的那一条数据进行删除就可以了。

追问

delete from 表 where C in (select min(C) from 表 where 时间 in (select 时间from zr_表 where bid = 000019 and fid = 0011 and A='13' and B='57' group by 时间 having COUNT(时间)>1));

还是不对,我用的mysql 数据库。
报错:
你不能指定目标表的更新zr_controllercurrentvalue在FROM子句

追答

你把这条拼接语句分开执行下看能否查到数据?

先执行最里层的select语句看有数据没?
:select 时间 from 表 where a='13' and b='57' group by 时间 having COUNT (时间)>1
然后再执行

select min(c) from 表 where 时间 in (
select 时间 from 表 where a='13' and b='57' group by 时间 having COUNT (时间)>1
)
最后

select * from 表 where c in (
select min(c) from 表 where 时间 in (
select 时间 from 表 where a='13' and b='57' group by 时间 having COUNT (时间)>1
)
)
看 是哪一步出错了?

参考技术B sqlserver2005以上版本适用
;with cte as
(select *,row_number() over(partition by 时间,a,b order by c desc) rn from tb )
delete cte where rn>1追问

mysql数据库,有点没看懂

追答

mysql~先查询一下在改成delete
delete tb where exists

(select 1 from tb as t where tb.时间=t.时间 and tb.a=t.a and tb.b=t.b
and t.c>tb.c)

追问

还是没弄出来

追答

这样查询查询不到较小值吗?

select * from tb where exists
(select 1 from tb as t where tb.时间=t.时间 and tb.a=t.a and tb.b=t.b
and t.c>tb.c)

追问

我刚接触不久,你有什么聊天方式没,qq什么的

追答

额。。上班中,什么都不能用,就把上面的tb换成你的表名就行了吧,至少查询是可以的吧

追问

as t中t是什么,tb.时间=t.时间 中tb是表名,t也是表名吗,可能问的有点弱智,刚毕业的,大哥多帮帮忙

追答

as t定义了个表别名,因为这是同表的相关子查询,定义别名用来区分内部字表与外部主表
tb.时间=t.时间这个tb是你的表名,定义了表别名的表不能再用自身的表名引用,只能用别名,所以tb.时间就代表外部的主表,如果这里省略了引用默认是内部子表列,所以要加tb.这样的引用

本回答被提问者和网友采纳
参考技术C delete from table where (time,a,b,c) in (select time,a,b,min(c) from table group by time,a,b having count(*) >1) 参考技术D select *
from (select a.*,row_number() over(partiton by 时间,a,b order by c desc) rn
from 表A a)
where rn = 1追问

我想把错误数据删除

第5个回答  2013-03-16 ; SQLSERVER2005以上适用于热膨胀系数

(SELECT *,ROW_NUMBER()OVER(分区时,A,B由C递减顺序)RN TB)的
删除CTE的地方RN> 1

SQL语句把同一个表中的a字段中的数据复制到另一个字段b中

客户表cust,里面有两个字段unit和s8_16两个字段,怎么把unit中的数据复制到s8_16中,并同时清空unit中的数据

参考技术A

SQL语句把同一个表中的a字段中的数据复制到另一个字段b中
的方法。
一、实现方法
1、比如表格:aaa,表格结构及数据如图:
2、使用SQL语句:update
aaa
set
b
=
a
,将a字段的值都复制到了b字段,结果如图:
二、需要注意,a字段与b字段的数据类型要相同,不同的话执行语句系统会报错,当然也可以通过cast()、convert()之类的函数,进行数据类型转换之后再进行更新。

以上是关于sql语句 同一时间出现2条数据,对比其中某一字段,删除其中较小的一条的主要内容,如果未能解决你的问题,请参考以下文章

sql单表中某一字段重复,取最近3条或几条数据

求SQL语句,统计一张表格中,某一时间段,例如连续10天,每间隔2小时,该表中增加的记录条数。

sql语句怎么添加一条记录?

SQL语句怎么筛选表中某一字段不重复的数据行数?

sql语句更新字段里面的值,比方说 我要去掉某一列里面所有值的最后的一个字母(有空值)

SQL如何查询出某一列中不同值出现的次数?