在嵌套查询中按属性获取组

时间:2017-03-08 13:26:04

标签: postgresql group-by nested-query

我试图在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

相反,因为哪里无法正常工作。

2 个答案:

答案 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 +获得。

http://rextester.com/GHGJH15037

答案 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;