2016-09-13 60 views
0

最下方位置我有以下结构表:甲骨文 - 选择重复记录具有表

Col1 | Col2 
Qwe | 99 
Rty | 67 
Qwe | 23 
Uio | 66 

表由具有相同Col1领域重复记录。我需要提取记录,其中Col2等于23,我的意思是表中具有最低位置的记录。可以有两个以上的记录与Col1相同。我无法通过使用特定的值Col1来查询此值。可以通过使用rownum完成吗?我无法检查,因为我目前无法访问计算机。提前致谢!

P.S.从电话打字... P.S.编辑非常欢迎...

回答

0

下面是原始表,我需要得到第2,5,6和7号,因为我需要所有非重复记录和每个表中最低位置的重复记录之一。

Col1 | Col2 | Col3 
Qwe | 99 | A 
Rty | 67 | B 
Qwe | 23 | A 
Uio | 66 | C 
Uio | 99 | C 
Asd | 11 | D 
Qwe | 45 | A 

解决方案是创建一个临时表,包含每个记录的实际ROWNUM和最大的rownum:

create table my_tab_temp as(
    select mt.*, 
      last_value(rownum) over (partition by mt.col3 order by mt.col3 desc) as max_rownum, 
      rownum "ROW_NUM" 
    from my_tab mt 
); 

和选择我需要的记录:

select * from my_tab_temp mtt 
where mtt.max_rownum = mtt.row_num; 

结果:

Col1 | Col2 | Col3 
Qwe | 45 | A 
Rty | 67 | B 
Uio | 99 | C 
Asd | 11 | D 
0

你尝试

SELECT * FROM table_name WHERE Col2 = 23 GROUP BY Col1, Col2 HAVING COUNT(*) > 1 
+0

“Se” lect *“工作,如果”group by“存在。它至少不适用于DB2。 – mm759

+0

我无法使用特定值查询表,因为查询会选择所有记录,包括具有最低位置的重复行 –

0
SELECT * 
FROM table t 
WHERE t.id IN (
    SELECT MIN(t2.Id) 
    FROM table t2 
    WHERE t2.Col2 = 23 
    GROUP BY t2.Col1 
) 

查询假定有一个Id -column是主键,把它作为行号。如果没有这样的列,你将不得不检查Oracle是否有“行号”的概念。