如何在重复多列的列中获取ID

How to fetch the ids in a column where multiple columns are repeated

我有一个 table 像下一个:

 TABLE 1
 -------
 ID        Integer
 COLUMN_1  Text
 COLUMN_2  Text
 COLUMN_3  Integer 

如何获取在同一列中重复 COLUMN_1COLUMN_2COLUMN_3 组合的 ID?

我计算了重复分组的列,如下所示:

select  column_1, column_2, column_3, count(*) from table_ 1 group by icolumn_1, column_2, column_3;

但我正在寻找的是如何同时获取 ID。


例子

所以如果我有下一个数据:

ID  | COLUMN_1 | COLUMN_2 | COLUMN_3
1   |     BLUE |  FISH    |  SEA
2   |     BLUE |  FISH    |  SEA
3   |     BLUE |  FISH    |  RIVER

我正在寻找如下结果:

 IDs Repeated |  COLUMN_1 | COLUMN_2 | COLUMN_3 | COUNT
     1, 2     |     BLUE  |  FISH    |    SEA   |   2
       3      |     BLUE  |  FISH    |    RIVER |   1

可以用聚合函数来完成string_agg(expression, delimiter)。 有一个类似的问题here。它有一个例子的答案。

在您的特定情况下,以下查询应该可以满足您的要求:

SELECT string_agg(id::varchar, ', ') AS "IDs Repeated",
  column_1, column_2, column_3, COUNT(*)
FROM p
GROUP BY column_1, column_2, column_3;

(我更正了我认为是您结果列名称中的拼写错误)。

但是,结果不是第一范式。您可能对以下查询感兴趣:

SELECT id, column_1, column_2, column_3, COUNT(*) OVER (PARTITION BY column_1, column_2, column_3)
FROM p;

 id | column_1 | column_2 | column_3 | count 
----+----------+----------+----------+-------
  3 | BLUE     | FISH     | RIVER    |     1
  1 | BLUE     | FISH     | SEA      |     2
  2 | BLUE     | FISH     | SEA      |     2
(3 rows)

检查这个。

        SELECT array_to_string(array_agg(id), ',') as "IDs Repetead",
        COLUMN_1,COLUMN_2, COLUMN_3,count(id) as "COUNT" 
        FROM temp
        GROUP BY COLUMN_1,COLUMN_3,COLUMN_2
        order by  "IDs Repetead"