SQL:Group by count(*)作为表总行数的pct

SQL:Group by count(*)作为表总行数的pct,sql,postgresql,Sql,Postgresql,我已经花了很多时间寻找这个,请让我知道如果重复 我需要编写一个分组查询,返回记录的类别以及每种类别的计数。大概是这样的: select categorynum, count(*) from tbl group by categorynum; select categorynum,count,100*count/(sum(count) over ())::numeric as count_pct from( select categorynum,count(1) from tbl

我已经花了很多时间寻找这个,请让我知道如果重复

我需要编写一个分组查询,返回记录的类别以及每种类别的计数。大概是这样的:

select categorynum, count(*) from tbl group by categorynum;
select categorynum,count,100*count/(sum(count) over ())::numeric as count_pct
from(
    select categorynum,count(1)
    from tbl
    group by categorynum
)a;
到目前为止还不错。现在我需要的是确定每个类别的总数所占的百分比。我想到的最好的办法是这个,我不喜欢,它感觉脏兮兮的:

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum;
这很管用,但这样做真的让我很烦。我使用的数据库是Postgres语法兼容的,并且表上的
count(*)
速度非常快,因此在表上执行
count(*)
不会带来巨大的速度冲击,尽管我希望尽可能编写更好的SQL


那么有没有更好的方法来写这个?这是我经常遇到的情况,因此我希望正确编写查询。

由于PostgreSQL支持窗口函数,您可以执行以下操作:

select categorynum, count(*) from tbl group by categorynum;
select categorynum,count,100*count/(sum(count) over ())::numeric as count_pct
from(
    select categorynum,count(1)
    from tbl
    group by categorynum
)a;
您还可以作为单独的查询对表进行计数(*),然后在SELECT语句的FROM部分将其与原始查询连接起来。这应该比将其放入“选定零件”中更快

select categorynum, categorycount, total
from (select categorynum, count(*) as categorycount
      from tbl
      group by categorynum) categories,
     (select count(*) as total from tbl) totals

这比原来的更复杂,但它会运行得更快吗?这种类型的查询有很多潜在的应用,感谢指针!好的,如果相对于
tbl
中的行数,
categorynum
的值很少,那么大部分工作将在子查询中完成。如果与
tbl
中的行数相关的不同
类别的比例相对较高,则
总和可能会使您的速度过慢。对于这两个查询,我都会通过
explain
检查查询计划。非常欢迎你。:)谢谢,那是我以前唯一的选择。。。问题是这张表总是在添加数据,而且我更希望有一个查询,而不是运行两个查询,然后将数字输入计算器/电子表格以获得百分比。我想回答者心里只有一个查询。。。我会在答案中写一条建议,这样答案才可读。虽然我刚才添加的示例并不比你在问题中的示例更有效,但它们都会导致对表格进行两次完整扫描。啊,好吧,这些东西只有通过尝试才能真正学到。是的,在Postgres中可能会进行全表扫描,但我在问题中指出,
count(*)
在我的DB中(它与Postgres语法兼容),它不会导致全表扫描,所以这不是一个因素。