在嵌套查询中按属性获取分组
Getting group by attribute in nested query
我试图在 postgresql table 中找到最频繁的值。问题是我还想 "group by" 在 table 中,并且只从具有相同名称的值中获取最频繁的值。
所以我有以下查询:
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" 获取外部组,但它似乎不起作用。有什么想法吗?
编辑:例如在下面table:
name value
a 3
a 3
a 3
b 2
b 2
我想得到:
name value
a 3
b 2
但是上面的语句给出了:
name value
a 3
b 3
相反,因为 where 无法正常工作。
如果您希望查询有效,您需要 table 个别名。 Table 别名和限定的列名 总是 一个好主意:
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;
PostgreSQL 中有一个针对这种情况的专用函数:mode()
ordered-set aggregate:
select name, mode() within group (order by value) mode_value
from table
group by name;
哪个 returns 最频繁的输入值(如果有多个相同频率的结果,则任意选择第一个) -- 这与 with 的行为相同你的 order by count(*) desc limit 1
.
它可从 PostgreSQL 9.4+ 获得。
我试图在 postgresql table 中找到最频繁的值。问题是我还想 "group by" 在 table 中,并且只从具有相同名称的值中获取最频繁的值。 所以我有以下查询:
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" 获取外部组,但它似乎不起作用。有什么想法吗?
编辑:例如在下面table:
name value
a 3
a 3
a 3
b 2
b 2
我想得到:
name value
a 3
b 2
但是上面的语句给出了:
name value
a 3
b 3
相反,因为 where 无法正常工作。
如果您希望查询有效,您需要 table 个别名。 Table 别名和限定的列名 总是 一个好主意:
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;
PostgreSQL 中有一个针对这种情况的专用函数:mode()
ordered-set aggregate:
select name, mode() within group (order by value) mode_value
from table
group by name;
哪个 returns 最频繁的输入值(如果有多个相同频率的结果,则任意选择第一个) -- 这与 with 的行为相同你的 order by count(*) desc limit 1
.
它可从 PostgreSQL 9.4+ 获得。