【发布时间】:2015-01-16 06:52:49
【问题描述】:
CREATE TABLE testdup
(seq_no NUMBER,
ID NUMBER,
attrib1 NUMBER,
attrib2 NUMBER);
INSERT INTO testdup
VALUES (2, 15, 1211, 1250);
INSERT INTO testdup
VALUES (1, 15, -999, -999);
INSERT INTO testdup
VALUES (3, 16, 1234, 1234);
INSERT INTO testdup
VALUES (4, 16, 1234, -1234);
INSERT INTO testdup
VALUES (5, 17, -999, -999);
INSERT INTO testdup
VALUES (6, 17, -999, -999);
INSERT INTO testdup
VALUES (7, 18, -999, -999);
INSERT INTO testdup
VALUES (8, 19, 741, -715);
COMMIT ;
我需要做的是,删除重复的 id -
- 如果重复的 ids 记录具有值(attrib1= 除 -999 之外的任何值),则删除较低的 seq_no(在上面的示例中 id=16)
- 如果 -999 与非 -999 一起存在(在上面的示例中 id=15),则删除值为 -999 的记录
- 如果所有记录都存在重复记录值“attrib1=-999”,则删除较低的 seq_no(在上面的示例中 id=17)
- 跳过不重复的 id(在上面的示例中 id=18 和 19)
在上面的例子中,seq_no 应该删除 1、3 和 5
数据库 - Oracle 10g
下面的查询给了我部分输出,但是当给定 id 的 attrib1 相同时,删除 min(seq_id) 不起作用
SELECT seq_no, ID, attrib1,
ROW_NUMBER () OVER (PARTITION BY ID, ID ORDER BY CASE
WHEN attrib1 = -999
THEN 999999999
ELSE TO_NUMBER (attrib1)
END) rn
FROM testdup order by 1
我正在玩分析函数并找到了解决方案,将其附在此处供其他人参考
SELECT seq_no, ID, attrib1,
ROW_NUMBER () OVER (PARTITION BY ID ORDER BY CASE
WHEN attrib1 = -999
THEN 999999999
ELSE TO_NUMBER (attrib1)
END ASC,
seq_no DESC) rn
FROM testdup
【问题讨论】:
-
你的问题是什么?
-
attrib2是否会以某种方式影响所需的删除?如果我正确理解了您的要求,则不会。 -
@René Nyffenegger - attrib2 与删除无关
-
@Jens - 我正在尝试分区,但似乎卡住了
-
id=17 同时拥有
attrib1=-999,这与您在问题中所说的相反