我有一个复杂的oracle视图,它返回在返回的行内具有逻辑重复的数据。我的目标是当基于两列(文本和日期时间)找到重复项时只检索一行,但要根据第三列(日期时间)决定要返回哪一个重复项。基于三列删除结果集重复
我有模拟的结果低于设定到表中与存根数据(如发现here上SQLFiddle):
CREATE TABLE TimeTable (
ID number NOT NULL,
NAME VARCHAR2(20) NOT NULL, -- Grouped by this first
TARGETVALUE INT, -- ultimate target value to be returned (no precedence from this value)
NOTE VARCHAR2(20) NULL, -- Just a note for the developer on StackOverflow
BEGIN_DATE TIMESTAMP NOT NULL, -- Grouped by this 2nd (down to the minute, not seconds)
APPROVAL_DATE TIMESTAMP NOT NULL -- Decides the ties for duplicates
);
insert into TimeTable (ID, NAME, TARGETVALUE, NOTE, BEGIN_DATE, APPROVAL_DATE) values
(1, 'Alpha', 5, 'Duplicate First', '08-MAR-14 09.43.00.000000000',
'09-MAR-14 09.43.00.000000000');
insert into TimeTable (ID, NAME, TARGETVALUE, NOTE, BEGIN_DATE, APPROVAL_DATE) values
(2, 'Alpha', 2, 'Duplicate Middle', '08-MAR-14 09.43.00.000000000',
'09-MAR-14 09.43.00.000000000');
insert into TimeTable (ID, NAME, TARGETVALUE, NOTE, BEGIN_DATE, APPROVAL_DATE) values
(3, 'Alpha', 3, 'Final Target', '08-MAR-14 09.43.00.000000000',
'09-MAR-14 10.00.00.000000000');
-- Same time as alpha, but not related.
insert into TimeTable (ID, NAME, TARGETVALUE, NOTE, BEGIN_DATE, APPROVAL_DATE) values
(4, 'Beta', 4, 'Only Target', '08-MAR-14 09.43.30.000000000',
'09-MAR-14 11.00.30.000000000');
其中需要将是2行的
3, 'Alpha', 3, '08-MAR-14 09.43.00.000000000', '09-MAR-14 10.00.00.000000000'
4, 'Beta', 4, '08-MAR-14 09.43.30.000000000' '09-MAR-14 11.00.30.000000000'
结果集澄清的注意事项,如果我在数据库中有这个值
5, 'Alpha', 8, '09-MAR-14 09.43.00.000000000', '12-MAR-14 10.00.00.000000000'
然后t帽子阿尔法设置将是唯一的,并且也返回,因为它不被认为是重复的,因为不同的BEGIN_DATE
(这是3月9日而不是8日)。
这里有规律可循
- 的
NAME
涉及的数据。 BEGIN_DATE
是第二个关系,其中准确时间到分钟将有重复,需要根据#3删除重复。- 如果每个#1和#2有重复,那么它们将被删除,由最近的
APPROVAL_DATE
确定,这将在早期日期赢得。
无关,而是:你不应该依赖隐式数据类型转换。如果使用来自具有不同NLS设置的客户端计算机,则使用诸如''08 -MAR-14 09.43.00.000000000''这样的字符文字将无法可靠地工作。使用适当的ANSI时间戳文字或使用'to_timestamp()'函数使用月份编号,而不是名称。 – 2014-10-05 11:42:00
@a_horse_with_no_name(*嘿,我们都是70年代的琐事问题*)感谢提示,Oracle不是我的专长,但我正在学习。我需要一个SO的简单例子,时间戳只是一个方便。但你的建议很好。谢谢。 – OmegaMan 2014-10-06 14:09:33