Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 区分重复值组_Sql_Database_Oracle - Fatal编程技术网

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。那不是你想要的吗?不,那是我已经有的。我希望在单独的组中获取结果。单个SQL
select
仅返回一个结果集。你可以列举重复项(正如这个答案现在所做的),但我不确定你所说的“分离组”是什么意思。是的,使用
densite\u rank()
来标识每个组。如何隔离和扩展每个组?只需复制与第三列中的值匹配的行数。我无法运行该语句。我在使用Oracle数据库11g。@PedroN:现在呢?