查询数据排名情况SQL

 

1/准备测试数据

---------------------------------------------------------------------------------
create table t1(
c1 integer,
c2 integer,
c3 integer
);

 

insert into t1 values(1,2,3)

insert into t1 values(1,8,4)
insert into t1 values(1,4,4)

insert into t1 values(1,4,5)

insert into t1 values(1,5,5)

 

insert into t1 values(2,2,3)

insert into t1 values(2,8,4)
insert into t1 values(2,4,4)

insert into t1 values(2,4,5)

insert into t1 values(2,5,5)

 

2/查看排名

---------------------------------------------------------------------------------

A/单记录排名

select c1,c3,
(select count( c3)+1 from t1 a where a.c3>b.c3
and a.c1=b.c1 and a.c1 =1
) order_num
from t1 b
where  c1 =1
order by c1,c3

c1          c3          order_num             
----------- ----------- ----------------------
1           3           5                     
1           4           3                     
1           4           3                     
1           5           1                     
1           5           1     
B/多记录排名

select c1,c2,c3,
(select count( c3)+1 from t1 a where a.c3>b.c3
and a.c1=b.c1
) order_num
from t1 b
order by c1,c3


c1          c2          c3          order_num             
----------- ----------- ----------- ----------------------
1           2           3           5                     
1           8           4           3                     
1           4           4           3                     
1           4           5           1                     
1           5           5           1                     
2           2           3           5                     
2           8           4           3                     
2           4           4           3                     
2           4           5           1                     
2           5           5           1                     
 

在 Oracle 数据库中,查询表中存在重复数据的记录通常需要使用 `GROUP BY` 和 `HAVING` 子句来实现。以下是几种常见的方法: ### 查询整个表中的重复数据 如果要查找某个字段(例如 `id`)存在重复值的记录,可以使用以下 SQL 语句: ```sql SELECT * FROM table_name WHERE id IN ( SELECT id FROM table_name GROUP BY id HAVING COUNT(id) > 1 ); ``` 此查询将返回所有 `id` 字段存在重复值的记录。 ### 根据多个字段查找重复数据 如果需要根据多个字段(例如 `id` 和 `seq`)查找重复记录,可以使用如下语句: ```sql SELECT * FROM table_name a WHERE (a.id, a.seq) IN ( SELECT id, seq FROM table_name GROUP BY id, seq HAVING COUNT(*) > 1 ); ``` 此查询会根据 `id` 和 `seq` 的组合值来判断是否存在重复,并返回这些重复的记录。 ### 使用窗口函数对重复数据进行排序 如果您希望对重复数据按照特定字段进行排序,可以使用 `DENSE_RANK()` 函数结合 `PARTITION BY` 和 `ORDER BY` 来实现: ```sql SELECT id, accno, name, gxsj, DENSE_RANK() OVER (PARTITION BY accno ORDER BY gxsj DESC) AS pm FROM table_name; ``` 这个查询会对 `accno` 分组的数据按 `gxsj` 字段降序排列,并为每组内的记录分配一个排名排名值没有间断[^2]。 ### 删除重复数据并保留唯一一条 如果需要删除表中的多余重复记录,只保留每组中 `rowid` 最小的一条记录,可以使用如下语句: ```sql DELETE FROM table_name a WHERE id IN ( SELECT id FROM table_name GROUP BY id HAVING COUNT(*) > 1 ) AND rowid NOT IN ( SELECT MIN(rowid) FROM table_name GROUP BY id HAVING COUNT(*) > 1 ); ``` 这段 SQL 将删除除了每组 `id` 中 `rowid` 最小之外的所有重复记录。 ### 按照排序删除重复数据 另外,也可以通过先给数据排名再删除的方式来处理重复数据,比如保留每组内最新或最旧的一条记录: ```sql DELETE FROM table_name WHERE id IN ( SELECT id FROM ( SELECT id, DENSE_RANK() OVER (PARTITION BY accno ORDER BY gxsj DESC) AS pm FROM table_name ) WHERE pm != 1 ); ``` 在这个例子中,它会删除除了每组 `accno` 内按 `gxsj` 排序后排名第一的记录外的所有其他重复记录[^2]。 以上就是几种用于查找和处理 Oracle 数据库中重复数据的方法。根据实际需求选择合适的查询方式即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值