【问题标题】:Find most common elements in array with a group by使用 group by 查找数组中最常见的元素
【发布时间】:2014-01-09 23:24:04
【问题描述】:

我有一个具有以下结构的行表name TEXT, favorite_colors TEXT[], group_name INTEGER,其中每一行都有一个每个人最喜欢的颜色的列表以及该人所属的组。我如何GROUP BY group_name 并返回每个组中最常见颜色的列表?

您能否结合使用int[] && int[] 来设置重叠,int[] & int[] 来获得交叉点,然后再进行其他计算和排名?

【问题讨论】:

    标签: sql postgresql aggregate-functions postgresql-9.3 lateral


    【解决方案1】:

    又快又脏:

    SELECT group_name, color, count(*) AS ct
    FROM (
       SELECT group_name, unnest(favorite_colors) AS color
       FROM   tbl
       ) sub
    GROUP  BY 1,2
    ORDER  BY 1,3 DESC;
    

    最好使用LATERAL JOIN

    在 Postgres 9.3 或更高版本中,这是更简洁的形式:

    SELECT group_name, color, count(*) AS ct
    FROM   tbl t, unnest(t.favorite_colors) AS color
    GROUP  BY 1,2
    ORDER  BY 1,3 DESC;
    

    以上是简写

    ...
    FROM tbl t
    JOIN LATERAL unnest(t.favorite_colors) AS color ON TRUE
    ...
    

    与任何其他 INNER JOIN 一样,它会排除没有颜色的行 (favorite_colors IS NULL) - 就像第一个查询一样。

    要在结果中包含这样的行,请改用:

    SELECT group_name, color, count(*) AS ct
    FROM   tbl t
    LEFT   JOIN LATERAL unnest(t.favorite_colors) AS color ON TRUE
    GROUP  BY 1,2
    ORDER  BY 1,3 DESC;
    

    您可以在下一步中轻松汇总每组“最常见”的颜色,但您需要先定义“最常见的颜色”...

    最常见的颜色

    根据评论,选择出现 > 3 次的颜色。

    SELECT t.group_name, color, count(*) AS ct
    FROM   tbl t, unnest(t.favorite_colors) AS color
    GROUP  BY 1,2
    HAVING count(*) > 3
    ORDER  BY 1,3 DESC;
    

    聚合数组中的顶部颜色(按降序排列):

    SELECT group_name, array_agg(color) AS top_colors
    FROM  (
       SELECT group_name, color
       FROM   tbl t, unnest(t.favorite_colors) AS color
       GROUP  BY 1,2
       HAVING count(*) > 3
       ORDER  BY 1, count(*) DESC
       ) sub
    GROUP BY 1;
    

    -> SQLfiddle 演示全部。

    【讨论】:

    • 谢谢,您能解释一下按这些整数分组是如何实现这一点的吗?如果我想输入HAVING,那么我可以只要求在一个组中出现超过 3 次的颜色,我将把HAVING 放在哪里。我不断收到语法错误。
    • @mhkeller:考虑一下附录和更新的小提琴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多