【问题标题】:Select all columns with GROUP BY one column [duplicate]选择所有具有 GROUP BY 一列的列[重复]
【发布时间】:2017-02-10 11:32:40
【问题描述】:

我有这张桌子:

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

有没有办法按key分组来得到这个结果?

+----+-----+----------+
| 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);

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

这个问题有解决办法吗?

【问题讨论】:

  • 您需要一个聚合函数才能使用分组依据。你的聚合函数是什么?
  • 你需要什么聚合函数?平均计数或最小值或最大值或其他任何值

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


【解决方案1】:

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

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),你会得到另一个。

【讨论】:

  • 对于其他人:在此示例中,“id”是 mytable 的“主键”列。 (我可能错了,但这就是我的假设并且查询工作正常)
  • 请注意,joininner join 所描绘的 here 相同
【解决方案2】:

distinct on

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

请注意,order by 子句决定了哪一行将赢得平局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2012-05-16
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2019-11-15
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多