由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 找duplicate row的最有效的sql statement?
相关主题
我经常问的几道SQL SERVER DBA的面试题,图省事不问编程An interview question: data store schema design
urgent help! insert value into table做DW的,如何估计/衡量一项任务的工作量?
sql server 面试题 (9)出错了
better way to compare nullable columns?包子:SQL Server如何将一个字段的内容复制到另外一个字段?
Massive deleting in MYSQL数据 migrating中的风险, 注意事项
Re: How to find a duplicate record in AcMySQL 的一个问题求教
how to find duplicates in mysql什么时候不用索引
A weird errorlist duplicators in one table
相关话题的讨论汇总
话题: date话题: bit话题: error话题: duplicate话题: row
进入Database版参与讨论
1 (共1页)
b******e
发帖数: 1861
1
有一个table (parentId, tag, start_date, end_date, error_code). parentId,
error_code not nullable, 其他都是nullable. error_code 每一个bit表示一种error
, 最低一位表示duplicate。现在要写一个query来设或清除duplicate error.
duplicate是如果任何两个row的parentId, tag相同,start_date, end_date代表的
range overlap。query要在oracle, sqlserver都能run。大家有什么好建议。用merge,
update,还是什么性能最好。
运行时parentId, tag, default start date, default end date会作为prepared
parameter传入。start date or end date 是null的话要default成default start
date, default end date.
另外我们定义了BIT_AND,BIT_OR, BIT_XOR在oracle 和sqlserver上。所以query里可
以用这些function.
谢谢。
c*****d
发帖数: 6045
2
和BIT_AND,BIT_OR, BIT_XOR有什么关系?
下面例子中这两个row是不是认为duplicate,
table (parentId, tag, start_date, end_date, error_code)
row 1 - 1, 'A', '2014-01-01','2014-12-31','0000')
row 2 - 1, 'A', '2014-01-01','2014-01-01','0110')
b******e
发帖数: 1861
3
是duplicate, 要update error_code成0001和0111。只set最后一个bit. errorcode是
整数,不是string.

【在 c*****d 的大作中提到】
: 和BIT_AND,BIT_OR, BIT_XOR有什么关系?
: 下面例子中这两个row是不是认为duplicate,
: table (parentId, tag, start_date, end_date, error_code)
: row 1 - 1, 'A', '2014-01-01','2014-12-31','0000')
: row 2 - 1, 'A', '2014-01-01','2014-01-01','0110')

s**********o
发帖数: 14359
4
什么整数STRING,我们不CARE,
数据不一样哪里是DUP ROW,GROUP BY WHATEVER YOU THINK,
errorcode取MAX或者MIN
c*****d
发帖数: 6045
5
oracle dba教材里专门讲过这个问题
select a.*
from table_name a, table_name b
where a.parentId = b.parentId
and a.tag = b.tag
and a.rowid <> b.rowid
你要的是update,一样的道理

【在 b******e 的大作中提到】
: 是duplicate, 要update error_code成0001和0111。只set最后一个bit. errorcode是
: 整数,不是string.

b******e
发帖数: 1861
6
这个duplicate更多是business logic上的duplicate,比如说同一个订单里不能有两个
同样的零件有重叠的日期,因为涉及到日期重叠而不是一样,所以group by可能不行吧
。我想过简单的处理这个的Logic是遍历每一个row,然后用一个exists来找其他row有没
有跟这个row有一样的parent id, tag, overlap的日期的,如果有就设置错误位,没有
就清除错误位。不过感觉这样不会很快,可能会有更好的方法。
另外要求sqlserver和oracle都能用,只能是ansi sql了,又麻烦了点。

【在 s**********o 的大作中提到】
: 什么整数STRING,我们不CARE,
: 数据不一样哪里是DUP ROW,GROUP BY WHATEVER YOU THINK,
: errorcode取MAX或者MIN

b******e
发帖数: 1861
7
如果用update就类似下面这样要用2个,不知道 performance 会如何,有没有更好的方
法。
而且BIT_AND时怎样才能保证其他位不被抹掉,我要放多少个1在前面。还是说有其他的
数学方法可以把某一位抹去,不改变其他位。或者把数字convert成string再来替换某
一位置的字符?
update table_name a set error_code = BIT_AND(error_code, 111111110) WHERE
NOT EXISTS (select 1 from table_name b where b.parentId = a.parentId and b.
tag = a.tag and b.start_date <= a.end_date and b.end_date >= a.start_date);
update table_name a set error_code = BIT_OR(error_code, 0000000001) WHERE
EXISTS (select 1 from table_name b where b.parentId = a.parentId and b.tag
= a.tag and b.start_date <= a.end_date and b.end_date >= a.start_date);
如果用update就要用2个,
c*****d
发帖数: 6045
8
没必要那样update 2次,效率低
第一步。先update所有记录的error code最后一位为0
update ... set error_code=bit_and(error_code,1110);
第二步。有重复的才改为1
update ... set error_code=bit_or(error_code,0001)where exists ... ;

b.
tag

【在 b******e 的大作中提到】
: 如果用update就类似下面这样要用2个,不知道 performance 会如何,有没有更好的方
: 法。
: 而且BIT_AND时怎样才能保证其他位不被抹掉,我要放多少个1在前面。还是说有其他的
: 数学方法可以把某一位抹去,不改变其他位。或者把数字convert成string再来替换某
: 一位置的字符?
: update table_name a set error_code = BIT_AND(error_code, 111111110) WHERE
: NOT EXISTS (select 1 from table_name b where b.parentId = a.parentId and b.
: tag = a.tag and b.start_date <= a.end_date and b.end_date >= a.start_date);
: update table_name a set error_code = BIT_OR(error_code, 0000000001) WHERE
: EXISTS (select 1 from table_name b where b.parentId = a.parentId and b.tag

r**********d
发帖数: 510
9
did you try window function row_number() over( parition by )?
google it.
s**********o
发帖数: 14359
10
parition by一下看看,数据明明不一样,你所谓的DUP就是你自己说了算,那当然是你
自己想办法取数了

【在 r**********d 的大作中提到】
: did you try window function row_number() over( parition by )?
: google it.

1 (共1页)
进入Database版参与讨论
相关主题
list duplicators in one tableMassive deleting in MYSQL
How to query a treeRe: How to find a duplicate record in Ac
how to store a trie into database?how to find duplicates in mysql
SQL中NOT EXIST和NOT IN有什么区别?A weird error
我经常问的几道SQL SERVER DBA的面试题,图省事不问编程An interview question: data store schema design
urgent help! insert value into table做DW的,如何估计/衡量一项任务的工作量?
sql server 面试题 (9)出错了
better way to compare nullable columns?包子:SQL Server如何将一个字段的内容复制到另外一个字段?
相关话题的讨论汇总
话题: date话题: bit话题: error话题: duplicate话题: row