我的表格有以下结构:
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
访问数据。
答案 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的答案将为您提供所需的信息。