【问题标题】:Count occurrences of string from every column (Postgres)计算每列中字符串的出现次数(Postgres)
【发布时间】:2020-04-15 18:23:56
【问题描述】:

所以我有一个像这样结构简单的数据库


  CAT   | DOG   | FISH   
+-------+-------+--------+
| red   | blue  | orange |
+-------+-------+--------+
| green | black | white  |
+-------+-------+--------+
| red   | black | orange |
+-------+-------+--------+

我希望能够获得一个表格或对象或其他东西,它告诉我每列中每个字符串的频率。所以当我运行查询时,我想看到类似的东西

{cat: {"red": 2, "green": 1}, dog: {"blue": 1, "black": 2} , fish: {"orange": 2, "white": 1}}

我只需要快速查询。也会有 10 列而不是 3 列。

我已经四处搜索,但我发现的唯一方法是每列计算一个计数,所以就像

SELECT cat, count(cat) FROM my_table GROUP BY cat

但是,如果我想要 每列 列的频率,方法是执行 1 次查询而不是每列 1 次查询。

谢谢!

【问题讨论】:

    标签: sql postgresql performance


    【解决方案1】:

    一种方法使用分组集:

    select cat, dog, fish, count(*)
    from t
    group by grouping sets ( (cat), (dog), (fish) );
    

    如果您的列类型兼容,您还可以使用横向连接:

    select v.colname, v.val, count(*)
    from t cross join
         (values ('cat', cat), ('dog', dog), ('fish', fish)
         ) v(colname, val)
    group by v.colname, val;
    

    【讨论】:

    • 谢谢!关于速度,一个会比另一个更好吗?我不知道我是否可以在列上执行横向连接方式,但第一种方式效果很好。只是想知道如果有很多行是否会很好。
    • @WildWombat 。 . .我其实不知道。你应该两个都试试。我最好的猜测是grouping sets 在大数据上会快一点,因为在 行上进行三个单独的聚合应该比在 行上进行一次聚合要快。但也可能有其他因素会影响性能。
    • 完美,谢谢!老实说,第一种方法对我来说更有意义(我是 SQL 新手),所以我现在就使用它!这只是一个附带问题,但有没有办法使用第一种方法来获取原始行数?我在一些数据上绘制了这个图表,我当然可以添加 dog 中所有值的计数来获得总数,但是有没有办法通过 sql 显式获取它
    • @WildWombat 。 . .嗯。 . . sum(count(*)) over ()sum(count(*)) over () / 3grouping sets 很少使用窗口函数,但我猜是第一个。
    【解决方案2】:

    您可以使用横向连接取消透视,然后聚合:

    select x.animal, x.color, count(*) cnt
    from mytable t
    cross join lateral (values('cat', cat), ('dog', dog), ('fish', fish)) x(animal, color)
    group by x.animal, x.color
    order by x.animal, x.color
    

    Demo on DB Fiddle

    动物 |颜色 | cnt :----- | :----- | --: 猫 |绿色 | 1 猫 |红色 | 2 狗 |黑色 | 2 狗 |蓝色 | 1 鱼| 高分辨率照片| CLIPARTO橙色 | 2 鱼| 高分辨率照片| CLIPARTO白色 | 1

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 2022-01-06
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2019-06-03
      • 1970-01-01
      相关资源
      最近更新 更多