我有一个表数据如下:
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
。
如何获取所有列?
谢谢!
答案 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