选择GROUP BY一列的所有列

时间:2016-10-02 10:31:30

标签: sql postgresql greatest-n-per-group

我有这张桌子:

+----+-----+----------+
| id | name| key      |
+----+-----+----------+
| 1  | foo |111000    |
| 2  | bar |111000    |
| 3  | foo |000111    |
+----+-----+----------+

有没有办法按键分组才能得到这个结果?

+----+-----+----------+
| id | name| key      |
+----+-----+----------+
| 2  | bar |111000    |
| 3  | foo |000111    |
+----+-----+----------+

或者这个结果:

+----+-----+----------+
| id | name| key      |
+----+-----+----------+
| 1  | foo |111000    |
| 3  | foo |000111    |
+----+-----+----------+

如果我使用此查询:

SELECT * FROM sch.mytable GROUP BY(key);

这是不对的我知道,因为我应该按照我需要显示的所有列进行分组。

这个问题有解决方案吗?

2 个答案:

答案 0 :(得分:10)

适用于所有数据库引擎的查询将是

select t1.*
from sch.mytable t1
join
(
    SELECT min(id) as id
    FROM sch.mytable 
    GROUP BY key
) t2 on t1.id = t2.id

其中min(id)是影响您得到的结果的函数。如果您使用max(id),则会获得另一个。

答案 1 :(得分:7)

distinct on

select distinct on (key) *
from t
order by key, name

请注意,order by子句确定哪一行将赢得关系。