2017-01-12 12 views
1

テーブルの要素の割合/割合が所定の値より大きいか小さいかをデータベースに照会したいと思います。例えばPostgresql:値のどの部分が大きい/小さいかを調べるクエリ

、の私は、次のスキーマを持つテーブルshopping_list持っているとしましょう:内容と

id integer 
name text 
price double precision 

を:

id  name price 
1  banana  1 
2  book  20 
3 chicken  5 
4 chocolate  3 

私は今価格4で新しいアイテムを購入するつもりです、とこの新しい商品がショッピングリストでどこにランクされるのかを知りたい。この場合、要素は要素の50%より大きくなります。

は、私は2つのクエリとcount要素の数、例えば:

-- returns = 4 
SELECT COUNT(*) 
FROM shopping_list; 

-- returns = 2 
SELECT COUNT(*) 
FROM shopping_list 
WHERE price > 4; 

を実行することができます知っている。しかし、私は、その結果を後処理避けるために、単一のクエリでそれを行うしたいと思います。

答えて

0

私は私が望んでいたまさに行い、集計関数PERCENT_RANKが見つかりました:あなたはちょうど次のように両方の結果を得るための一つの方法がある

SELECT COUNT(*), 'total' 
FROM shopping_list 
UNION 
SELECT COUNT(*),'greater' 
FROM shopping_list 
WHERE price > 4; 
2

を:

指定した名前で、両方の結果が1つの行に表示されます。ただし、クエリ内でクエリが実行されます。

+0

私は、このソリューションを参照の問題はその方法である2 'SELECT'クエリは、(多分あまり効率的?)残っていますし、しかも私はまだやる必要があるだろうクエリ後に自分自身の比率。 –

0

単一のクエリの使用UNIONでそれらをしたい場合は

SELECT PERCENT_RANK(4) WITHIN GROUP (ORDER BY price) 
FROM shopping_list; 
-- returns 0.5 
1

最も簡単な方法は、avg()を使用することです:

SELECT AVG((price > 4)::float) 
FROM shopping_list; 
+0

私はこの解決策が本当に好きですが、Postgresでは 'bool'を浮動させるのに問題がありました。私はあなたのソリューションを直接 'int'にキャストするように編集します –

関連する問題