2017-01-12 3 views
1

Ich möchte meine Datenbank abfragen, um zu wissen, welcher Anteil/Prozentsatz der Elemente einer Tabelle größer/kleiner als ein gegebener Wert sind.Postgresql: Abfrage zu wissen, welcher Anteil der Werte größer/kleiner

Zum Beispiel sagen sie, ich habe eine Tabelle shopping_list mit folgendem Schema:

id integer 
name text 
price double precision 

mit Inhalt:

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

ich jetzt ein neues Objekt mit dem Preis 4 kaufen werde, und Ich würde gerne wissen, wo dieser neue Artikel in der Einkaufsliste platziert wird. In diesem Fall wird das Element größer als 50% der Elemente sein.

Ich weiß, dass ich zwei Abfragen ausführen kann und count die Anzahl der Elemente, z.B .:

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

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

Aber ich mag es mit einer einzigen Abfrage tun, um die Ergebnisse zu vermeiden Nachbearbeitung.

Antwort

0

fand ich die Aggregatfunktion PERCENT_RANK was genau das tut, was ich wollte:

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

wenn man ihnen nur wünschen in einzelnen Abfrage Verwendung UNION :

select count(*) as total, 
    (select count(*) from shopping_list where price > 4) as greater 
from shopping_list 

Es wird beide Ergebnisse in einer einzigen Zeile mit den angegebenen Namen erhalten . Es handelt sich jedoch um eine Abfrage in einer Abfrage.

+0

das Problem, das ich mit diesen Lösungen sehe, ist auf diese Weise gibt es noch zwei 'SELECT' Anfragen (? Vielleicht weniger effizient) sind und darüber hinaus würde ich noch tun müssen, das Verhältnis von mir nach der Abfrage. –

0

Ein Weg, um die beiden Ergebnisse ist wie folgt

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

Der einfachste Weg ist die Verwendung avg():

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

Ich mag diese Lösung wirklich, aber in Postgres hatte ich Probleme, 'bool' zu schweben. Ich bearbeite deine Lösung, um sie direkt nach 'int' zu übertragen –