Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在postgres sql中聚合第一个值?_Postgresql_Group By - Fatal编程技术网

Postgresql 如何在postgres sql中聚合第一个值?

Postgresql 如何在postgres sql中聚合第一个值?,postgresql,group-by,Postgresql,Group By,在这个postgres查询中 SELECT q.*, q.user_id = 1 mine, first(u.username) username, sum(case when v.answer=0 then 1 else 0 end) no_count, sum(case when v.answer=1 then 1 else 0 end) yes_count FROM question q JOIN "user" u ON q.user_id=u.i

在这个postgres查询中

SELECT
    q.*,
    q.user_id = 1 mine,
    first(u.username) username,
    sum(case when v.answer=0 then 1 else 0 end) no_count,
    sum(case when v.answer=1 then 1 else 0 end) yes_count
FROM question q 
JOIN "user" u ON q.user_id=u.id
JOIN vote v ON v.question_id=q.id
GROUP BY q.id
ORDER BY q.date_created desc 
LIMIT 20
OFFSET 0
它说我需要在
username
上进行聚合。在本例中,我得到了一些问题,每个问题都是由某个用户创建的。我通过投票加入,但根据问题id分组,因此在分组之前,用户名字段对于每个唯一的问题都是相同的。这意味着在聚合时,我可以选择任何值,因为它们都是一样的。但是,我找不到任何要使用的聚合函数。我尝试了随机的,第一次,最后一次,任何,但没有工作,甚至没有定义


有人知道如何处理这个问题吗?

好的,所以问题是sql引擎不知道
用户名总是相同的。换句话说,它无法区分
guestions
users
之间一对一、一对多的关系。您可以将
string_agg()
DISTINCT
一起使用,就像
string_agg(DISTINCT u.username,','::text)
。该函数所做的是将文本值加成一个由指定分隔符分隔的大字符串(在我的例子中是逗号)。添加
DISTINCT
时,它只接受唯一的值。既然你说过每个问题总是只有一个用户名,那么输出就是这个值

整个查询:

SELECT
    q.*,
    q.user_id = 1 mine,
    string_agg(DISTINCT u.username, ','::text) username,
    sum(case when v.answer=0 then 1 else 0 end) no_count,
    sum(case when v.answer=1 then 1 else 0 end) yes_count
FROM question q 
JOIN "user" u ON q.user_id=u.id
JOIN vote v ON v.question_id=q.id
GROUP BY q.id
ORDER BY q.date_created desc 
LIMIT 20;

脚注:我删除了
偏移量0
,因为它是postgresql不允许或不能执行此类操作框中
限制的默认值

您可以通过以下方法首先/最后扩展聚合函数:


postgresql有插件和可移植的sql版本。

只需将
用户名
添加到
分组依据
子句中,而不必进行聚合。