gpt4 book ai didi

postgresql - 如何聚合 postgresql 中的第一个值?

转载 作者:行者123 更新时间:2023-11-29 12:58:21 24 4
gpt4 key购买 nike

在这个 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 引擎不知道 username 将始终相同。换句话说,它无法区分 guestionsusers 之间的一对一关系和一对多关系。您可以将 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;

脚注:我删除了 OFFSET 0,因为它是 LIMIT 的默认值。

关于postgresql - 如何聚合 postgresql 中的第一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37103021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com