Postgresql 如何在postgres sql中聚合第一个值?
在这个postgres查询中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
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版本。只需将用户名
添加到分组依据
子句中,而不必进行聚合。