2011-11-04 7 views
6

これを検索するのに多くの時間を費やしましたが、重複している場合は教えてください。SQL:合計テーブル行数のpctとしての集計(*)

カテゴリの種類ごとにレコードのカテゴリを返すグループクエリを作成する必要があります。このようなもの:

select categorynum, count(*) from tbl group by categorynum; 

これまでのところとても良いです。今私が必要とするのは、各カテゴリのカウントが占める割合を決定することです。それは作品

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum; 

が、本当に私はこのようにそれを行うにはしつこいです:私が出ている最高のは、私はそれが汚い感じ、好きではないされ、これです。私が使用しているデータベースはPostgresの構文と互換性があり、テーブル上のcount(*)は非常に高速ですので、テーブルにcount(*)を実行しても大きなスピードはありませんが、できるだけもっと良いSQLを書いてみたいと思います。

これを書くには良い方法がありますか?これは私が頻繁に遭遇する状況なので、私は正確に質問を書いていきたいと思います。

答えて

5

PostgreSQLは、ウィンドウ機能をサポートしているので、あなたがこのような何かを行うことができます:

select categorynum,count,100*count/(sum(count) over())::numeric as count_pct 
from(
    select categorynum,count(1) 
    from tbl 
    group by categorynum 
)a; 
+0

これは元のものより複雑ですが、より速く実行できますか?このタイプのクエリには、ポインタのおかげで、多くの潜在的なアプリケーションがあります! –

+0

'tbl'の行数に対する' categorynum'の値がほとんどない場合、ほとんどの作業はサブクエリで行われます。 'tbl'の行数に対する別の 'categorynums 'の割合が比較的高い場合、' sum'はあなたの速度を遅くする可能性があります。私は両方のクエリの 'explain'を介してクエリプランをチェックします。あなたは大歓迎です。 :) –

1

あなたはまた、別のクエリとして、テーブルの上にCOUNT(*)を行い、その後で自分の元のクエリでそれに参加することができますSELECTステートメントのFROM部分。それはSELECT部分​​に入れるよりも速くなければなりません。

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

ありがとう、それは私が以前に持っていた唯一の選択肢だった...ということは、このテーブルは常にデータが追加されていることです。また、2つのクエリを実行し、パーセンテージを得るために電卓/スプレッドシートに入れます。 –

+0

私は回答者が念頭に置いて一つの質問をしていたと思います...私は答えが読める場所に答えを書きます。 – araqnid

+0

私が追加した例は、あなたの例より効率的ではありませんが、両方ともテーブルのフルスキャンが2つあります。ああ、これらのことは実際に試してみるだけです。 – araqnid

関連する問題