Postgres:在列上分组,但查询需要返回表中的所有列

时间:2014-08-06 20:25:28

标签: sql postgresql group-by

我的表格有以下结构:

id, user_id, connected_id, completed
1, 2345, 232, t
2, 2345, 121, f
3, 4324, 123, t
4, 4324, 121, t
5, 1211, 134, f
6, 1211, 111, t

有没有办法通过user_id获取表组的所有列。由于我group by的列必须在该子句中。有工作吗?

我试图构建以下结果集:

user_id, total_completed

我以为我会做两个阶段的过程,因为我实际上是通过mybatis访问数据。

3 个答案:

答案 0 :(得分:2)

看起来像你需要的是

  SELECT user_id,
         COUNT(CASE WHEN completed THEN 1 END) total_completed
    FROM tablename
GROUP BY user_id

答案 1 :(得分:1)

我想你想要distinct on

select distinct on (user_id) t.*
from mytable t
order by user_id;

这将为每个user_id返回一个任意行。

答案 2 :(得分:1)

使用GROUP BY时,输出列必须是您分组的列,或者可以是聚合函数。要了解原因,请考虑在示例数据中按user_id进行分组。如果您尝试输出列connected_id,该列应包含在user_id=2345行中的值是多少?有两个值,第一行为232,第二行为121。您必须选择如何处理多个值。您有几种选择:

  • connected_id添加到GROUP_BY子句中。这将为user_id=2345, connected_id=232提供一行输出,为user_id=2345, connected_id=121
  • 提供一行输出
   user_id  connected_id

   2345     232       
   2345     121       
   4324     123       
   4324     121       
   1211     134       
   1211     111       
  • 使用聚合函数array_agg(connected_id)。这将为您提供所有值作为数组:
    user_id  array_of_connected_id

    2345     {232, 121}
    4324     {123, 121}
    1211     {134, 111}
  • 使用像max(connected_id)这样的数学函数:
    user_id  max_of_connected_id

    2345     232
    4324     123
    1211     134

由于可以有多个值,因此必须明确说明如何处理这些多个值。对于您的具体情况,@zerkms的答案将为您提供所需的信息。