我试图在postgresql表中找到最常用的值。问题是我还希望在该表中“分组”,并且只从具有相同名称的值中获得最频繁的值。 所以我有以下查询:
select name,
(SELECT value FROM table where name=name GROUP BY value ORDER BY COUNT(*) DESC limit 1)
as mfq from table group by name;
所以,我正在使用where name=name
,尝试通过属性“name”获取外部组,但它似乎不起作用。关于如何做的任何想法?
编辑:例如,在下表中:
name value
a 3
a 3
a 3
b 2
b 2
我想得到:
name value
a 3
b 2
但上述陈述给出了:
name value
a 3
b 3
相反,因为哪里无法正常工作。
答案 0 :(得分:2)
在这种情况下,PostgreSQL中有一个专用函数:mode()
ordered-set aggregate:
select name, mode() within group (order by value) mode_value
from table
group by name;
返回最频繁的输入值(如果有多个同等频率的结果,则任意选择第一个) - 这与您的order by count(*) desc limit 1
的行为相同。
可从PostgreSQL 9.4 +获得。
答案 1 :(得分:1)
如果您希望查询起作用,则需要表别名。表别名和限定列名总是是个好主意:
select t.name,
(select t2.value
from table t2
where t2.name = t.name
group by t2.value
order by COUNT(*) desc
limit 1
) as mfq
from table t
group by t.name;