2011-06-27 4 views
4

ユーザがいるテーブルがあります。各ユーザーには国があります。私が望むのは、ユーザー数とパーセント/総数を持つすべての国のリストを取得することです。私が今までに持っているものは次のとおりです。サブクエリのないPostgreSQLの合計のパーセント

SELECT 
country_id, 
COUNT(*) AS total, 
((COUNT(*) * 100)/(SELECT COUNT(*) FROM users WHERE cond1 = true AND cond2 = true AND cond3 = true)::decimal) AS percent 
FROM users 
WHERE cond1 = true AND cond2 = true AND cond3 = true 
GROUP BY contry_id 

両方のクエリの条件は同じです。サブクエリなしでこれを実行しようとしましたが、その後、全ユーザー数を取得することはできませんが、国ごとの合計を取得することはできません。サブクエリなしでこれを行う方法はありますか?私はPostgreSQLを使用しています。どんな助けも高く評価されます。 ありがとうございます

答えて

2

私はPostgreSQLユーザーではありませんが、一般的な解決策はウィンドウ関数を使用することです。これを使用する方法についての記事を読むまで

http://developer.postgresql.org/pgdocs/postgres/tutorial-window.html

で私はそれを記述するために使用することができ

最良の説明は次のとおりです。基本的には、GROUP BY句なしで一つのフィールドにして、グループを行うことができます。

私は、これはトリックを行う可能性があると信じて:

SELECT 
    country_id, 
    COUNT(*) OVER (country_id) 
    ((COUNT(*) OVER (country_id)) * 100)/COUNT(*) OVER())::decimal) as percent 
FROM 
    users 
WHERE 
    cond1 = true AND cond2 = true AND cond3 = true 
+1

ありがとうございます!しかし、私は今PostgreSQLをアップグレードしなければなりません:D – fanjabi

+0

実際、このクエリはusersテーブルの行ごとに1つの出力行を生成するので、GROUP BYが必要です。私の答えを見てください。 – peufeu

+1

@peufeu:前にウィンドウ関数を書いたことはありませんし、テストしたこともありません。私は構文についてもう少し詳しく読む必要があるようです。 – Nightwolf

8

私はあなたがサブクエリを排除したい理由は二回usersテーブルをスキャンしないようにすることですね。合計は、各国のカウントの合計であることを忘れないでください。

WITH c AS (SELECT country_id, count(*) AS cnt FROM users WHERE cond1=... GROUP BY country_id) 
SELECT *, 100.0*cnt/(SELECT sum(cnt) FROM c) AS percent FROM c; 

このクエリは、国ごとの統計情報を含む小さなCTEを作成します。ユーザーテーブルを1回スキャンし、小さな結果セットを生成します(国ごとに1行のみ)。

合計(SELECT sum(cnt)FROM c)は、この小さな結果セットで1回だけ計算されるため、無視できる時間を使用します。

ます。また、ウィンドウ関数を使用できます。両方のクエリが同じくらいの時間かかり

(笑削除エラーのあるnightwolfのクエリと同じである)

SELECT country_id, cnt, 100.0*cnt/(sum(cnt) OVER()) AS percent 
FROM (SELECT country_id, count(*) as cnt from users group by country_id) foo; 

+0

ありがとう! **** ^ を選択(AS C WITH: 'ERROR:構文エラーまたはその付近 "C WITH" LINE 1) – fanjabi

+0

うーん...私はエラーを取得し、アップグレードするまでそれを試してみるだろう******エラー********** エラー:「WITH c」の構文エラー SQLの状態:42601 文字:1 ' – fanjabi

+0

WITH cte's(共通テーブル式)とウィンドウ関数... – peufeu

関連する問題