对于Postgresql 8.x,我有一个包含answers
的{{1}}表,其中(id, user_id, question_id, choice)
是一个字符串值。我需要一个查询,它将为所有唯一choice
值返回一组记录(返回的所有列)。我正在寻找的是每个独特选择的单一代表性记录。我还希望有一个聚合choice
列,该列是与每条记录附带的每个唯一选择匹配的记录数的votes
。我想强制count()
为小写,以便进行此比较( HeLLo 和 Hello 应该被视为相等)。我不能choice
因为我想要结果集中的所有列。按所有列分组会导致返回所有记录,包括所有重复记录。
GROUP BY lower(choice)
这个问题是它不会返回所有列。
select lower(choice), count(choice) as votes from answers where question_id = 21 group by lower(choice) order by votes desc;
lower | votes
-----------------------------------------------+-------
dancing in the moonlight | 8
pumped up kicks | 7
party rock anthem | 6
sexy and i know it | 5
moves like jagger | 4
因为我没有指定select *, count(choice) as votes from answers where question_id = 21 group by lower(choice) order by votes desc;
中SELECT
的每一列,所以这会引发错误,告诉我这样做。
GROUP BY
GROUP BY
对于所有记录,这只会将select *, count(choice) as votes from answers where question_id = 21 group by lower(choice), id, user_id, question_id, choice order by votes desc;
列的表格转储为votes
。
如何从 1。获取1
计数和唯一代表性记录,但是返回表中的所有列?
答案 0 :(得分:0)
将分组结果与主表结合起来,然后每个(问题,答案)组合只显示一行。
与此类似:
WITH top5 AS (
select question_id, lower(choice) as choice, count(*) as votes
from answers
where question_id = 21
group by question_id , lower(choice)
order by count(*) desc
limit 5
)
SELECT DISTINCT ON(question_id,choice) *
FROM top5
JOIN answers USING(question_id,lower(choice))
ORDER BY question_id, lower(choice), answers.id;
答案 1 :(得分:0)
这是我最终的结果:
SELECT answers.*, cc.votes as votes FROM answers join (
select max(id) as id, count(id) as votes
from answers
group by trim(lower(choice))
) cc
on answers.id = cc.id ORDER BY votes desc, lower(response) asc