选择*按不同列分组

时间:2018-11-06 22:37:10

标签: sql oracle

我有一个表数据如下: Id c1 c2 8802 1 1 8802 3 1 8802 3 2 8802 4 1

如何编写查询以获取所有列,但具有唯一的(id,c1)。 c2中的值是什么都没关系

我的最终输出看起来像这样

Id c1 c2 2202 1 1 2202 3 (1 or 2 does not matter) 2202 4 1

我在表中有10多个列,并且所有列都需要显示。要使用group by子句,我需要提供一个带有这些特定列名的select子句,而没有得到我想要的输出

select Id, c1 from table group by (Id, c1)只会列出Id,c1

如何获取所有列?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用聚合功能:

select id, c1, min(c2) as c2
from t
group by id, c1;

您想要每个id / c1的不同值一行。因此,这些应该在group by中。如果需要其他列,则应将它们作为聚合函数的参数。

您可以使用窗口函数来获取一列列:

select t.*
from (select t.*, row_number() over (partition by id, c1 order by id) as seqnum
      from t
     ) t
where seqnum = 1;

答案 1 :(得分:0)

由于您正在使用分组依据,因此您需要对其进行聚集。您可能不在乎返回哪个C2值。但是系统需要知道您想要哪一个。

所以:

SELECT ID, C1, max(C2) 
FROM table 
GROUP BY ID, C1

或使用窗口函数(如LISTAGG)将所有值组合成逗号分隔的列表

SELECT ID, C1, LISTAGG(C2, ', ') WITHIN GROUP (ORDER BY C2)` 
FROM table
GROUP BY ID, C1 

或者使用CTE和窗口函数来分配行号,并将行数限制为每个分组的第一条记录。给定其他列,并希望将相关值设为相同的C2值;这似乎是最好的方法。

WITH CTE AS (
SELECT A.*, Row_number() over (partition by ID, C1 ORDER BY C2) RN
FROM table A)
SELEC *
FROM CTE
WHERE RN = 1