2013-04-12 2 views
1

Моя табличное значение:удаление дубликатов на основе состояния

COLUMN1 COLUMN2 COLUMN3 
WF1  Email 1640 
WF1  Email 1641 
WF1  Email N/A 
WF3  Email N/A 

Ожидаемый результат:

COLUMN1 COLUMN2 COLUMN3 
WF1  Email 1640 
WF3  Email N/A 

Мне нужно получить все записи, которые COLUMN2 = «Email» и если column1 содержит повторяющееся значение, я выбрать запись, в которой столбец <> 'N/A'.

Я прочитал учебник о разделе, но все еще не уверен, как получить результат.

Любая помощь приветствуется.

CREATE TABLE TABLE1 
    (

    COLUMN1 varchar2(20), 
    COLUMN2 varchar2(20), 
    COLUMN3 varchar2(20) 
    ); 

INSERT INTO TABLE1 
(COLUMN1, COLUMN2, COLUMN3) 
VALUES 
('WF1', 'Email', '1640'); 

INSERT INTO TABLE1 
(COLUMN1, COLUMN2, COLUMN3) 
VALUES 
('WF1', 'Email', '1641'); 

INSERT INTO TABLE1 
(COLUMN1, COLUMN2, COLUMN3) 
VALUES 
('WF1', 'Email', 'N/A'); 

INSERT INTO TABLE1 
(COLUMN1, COLUMN2, COLUMN3) 
VALUES 
('WF3', 'Email', 'N/A'); 

ответ

3

Попробуйте что-то вроде этого:

SELECT column1, column2, column3 
from(
SELECT column1, column2, column3, 
row_number() over (partition BY column1, column2 ORDER BY CASE WHEN column3 = 'N/A' THEN 999999999 ELSE to_number(column3) END) rn 
FROM table1) 
WHERE rn = 1 

Here is a sqlfiddle

+0

Благодарим за помощь :) –

+0

Это просто решило несколько часов натягивания волос для меня ... спасибо. –

0
select column1,column2,max(case when column3 = 'N/A' then '0' else column3 end) column3 
from table1 
group by column1,column2; 
0

Если column1 может быть не единственным в результате:

select column1, column3 from table1 t1 
where column3 != 'N/A' or 
column3 = 'N/A' and not exists 
(select * from table1 t2 
where t2.column1 = t1.column1 and t2.column3 != 'N/A') 

Если column1 должно быть уникальным в результат:

select column1, column3 from table1 t1 
where column3 != 'N/A' and not exists 
(select * from table1 t2 
where t2.column1 = t1.column1 and t2.column3 != 'N/A' and 
to_number(t2.column3, '9999') > to_number(t1.column3, '9999') 
) union 
select column1, column3 from table1 t1 
where column3 = 'N/A' and not exists 
(select * from table1 t2 where t2.column1 = t1.column1 and t2.column3 != 'N/A') 

Обратите внимание, что мы используем союз вместо объединения всех.

Смежные вопросы