Sql 区分重复值组
假设我有下表Sql 区分重复值组,sql,database,oracle,Sql,Database,Oracle,假设我有下表表: +---------+---------+ | column1 | column2 | +---------+---------+ | A | B | | A | A | | A | A | | C | D | | B | B | | B | B | +---------+---------+ SELECT * FROM t
表:
+---------+---------+
| column1 | column2 |
+---------+---------+
| A | B |
| A | A |
| A | A |
| C | D |
| B | B |
| B | B |
+---------+---------+
SELECT *
FROM table
WHERE (column1,
column2) IN ( SELECT column1,
column2
FROM table
GROUP BY column1,
column2
HAVING COUNT (*) > 1);
我正在查询数据库以获取表中所有重复的行
:
+---------+---------+
| column1 | column2 |
+---------+---------+
| A | B |
| A | A |
| A | A |
| C | D |
| B | B |
| B | B |
+---------+---------+
SELECT *
FROM table
WHERE (column1,
column2) IN ( SELECT column1,
column2
FROM table
GROUP BY column1,
column2
HAVING COUNT (*) > 1);
得到这个:
+---------+---------+
| column1 | column2 |
+---------+---------+
| A | A |
| A | A |
| B | B |
| B | B |
+---------+---------+
是否有办法隔离每组重复的行,保存它们,然后获取下一组?最后,我将得到不同的结果集:
Result set #1:
+---------+---------+
| column1 | column2 |
+---------+---------+
| A | A |
| A | A |
+---------+---------+
Result set #2:
+---------+---------+
| column1 | column2 |
+---------+---------+
| B | B |
| B | B |
+---------+---------+
我的想法是创建一个序列,以便枚举每个组,如下所示:
Result set #1:
+---------+----------+
| column1 | column2 |
+---------+----------+
| A | A1 |
| A | A2 |
+---------+----------+
Result set #2:
+---------+----------+
| column1 | column2 |
+---------+----------+
| B | B1 |
| B | B2 |
+---------+----------+
谢谢。这是你想要的吗
select groupnum, column1, column2, seqnum
from (select t.*, count(*) over (partition by column1, column2) as cnt,
dense_rank() over (order by column1, column2) as groupnum,
row_number() over (partition by column1, column2 order by column1) as seqnum
from table t
) t
where cnt > 1
order by groupnum;
从逻辑的角度来看
A | A
A | A
…和…是一样的
A | A | 2
那么,为什么不:
SELECT column1, column2, COUNT(*)
FROM T
GROUP BY column1, column2
HAVING COUNT(*) > 1
?
你会得到一个结果,比如
A | A | 2
B | B | 2
…换句话说:每一行代表一个完整的组。如果需要,您可以轻松地“扩展”客户端代码中的每个组。尝试以下操作:
SELECT column1,CASE WHEN RN=1
THEN column2
ELSE CONCAT(column2,convert(varchar(10), (RN-1)))
END as column2
FROM
(SELECT column1,column2,ROW_NUMBER() OVER(PARTITION BY column1,column2 ORDER BY column2,column2) as RN
FROM TableName) T
结果将类似于:
COLUMN1 COLUMN2
A A
A A1
A B
B B
B B1
C D
例如,我得到了相同的结果,即所有重复的行。@PedroN。那不是你想要的吗?不,那是我已经有的。我希望在单独的组中获取结果。单个SQLselect
仅返回一个结果集。你可以列举重复项(正如这个答案现在所做的),但我不确定你所说的“分离组”是什么意思。是的,使用densite\u rank()
来标识每个组。如何隔离和扩展每个组?只需复制与第三列中的值匹配的行数。我无法运行该语句。我在使用Oracle数据库11g。@PedroN:现在呢?