Oracle - 选择表中位置最低的重复记录

时间:2016-09-13 10:09:22

标签: oracle11g duplicates

我的桌子有以下结构:

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

表包含具有相同Col1字段的重复记录。我需要提取Col2等于23的记录,我的意思是表中位置最低的记录。相同Col1的记录可以超过2条。我无法使用特定的Col1值来查询此信息。可以使用rownum来完成吗?我无法检查这一点,因为我目前无法访问计算机。提前谢谢!

P.S。从手机打字...... 附:编辑非常受欢迎......

3 个答案:

答案 0 :(得分:0)

你试过吗

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

答案 1 :(得分: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 - 列是主键,并将其用作行号。如果没有这样的列,您将不得不检查Oracle是否有一个概念"行号"。

答案 2 :(得分: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和max 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