2017-02-10 1 views
0

Ich versuche, ein Perzentil mit der Percentile_cont() - Funktion in PostgreSQL mit gemeinsamen Tabellenausdrücken zu berechnen. Das Ziel ist, die besten 1% der Konten hinsichtlich ihrer Salden zu finden (hier Betrag genannt). Meine Logik ist das 99. Perzentil zu finden, die diejenigen, deren Kontostände sind mehr als 99% ihrer Kollegen (und damit die Suche nach dem 1 percenters) zurück istKonnte Percentile_Cont() nicht in Postgresql arbeiten

Hier meine Frage

--ranking subquery works fine 
with ranking as(
     select a.lname,sum(c.amount) as networth from customer a 
     inner join 
     account b on a.customerid=b.customerid 
     inner join 
     transaction c on b.accountid=c.accountid 
     group by a.lname order by sum(c.amount) 
) 
select lname, networth, percentile_cont(0.99) within group 
order by networth over (partition by lname) from ranking ; 

ich halte die immer Folgefehler

ERROR: syntax error at or near "order" 
LINE 2: ...ame, networth, percentile_cont(0.99) within group order by n.. 

Ich denke, dass ich vielleicht eine schließende Klammer etc. vergessen habe, aber ich kann nicht herausfinden, wo. Ich weiß, es könnte etwas mit dem Schlüsselwort order sein, aber ich bin mir nicht sicher, was ich tun soll. Können Sie mir bitte helfen, diesen Fehler zu beheben?

+0

. . Ihre ursprüngliche Abfrage ergibt keinen Sinn. Sie gruppieren nach 'lname' und verwenden dann das für die Partition für' networth'. Da es nur eine Zeile gibt, ergibt ein 99. Perzentil keinen Sinn. Vielleicht möchten Sie eine andere Frage mit Beispieldaten und gewünschten Ergebnissen stellen. –

Antwort

1

Ihnen fehlen die Klammern im within group (order by x) Teil.

Versuchen Sie folgendes:

with ranking 
as (
    select a.lname, 
     sum(c.amount) as networth 
    from customer a 
    inner join account b on a.customerid = b.customerid 
    inner join transaction c on b.accountid = c.accountid 
    group by a.lname 
    order by networth 
    ) 
select lname, 
    networth, 
    percentile_cont(0.99) within group (
     order by networth 
     ) over (partition by lname) 
from ranking; 
+0

Ich bekomme einen ähnlichen Fehler, wenn ich dies versuche- Fehler: Syntax Fehler bei oder nahe "(" LINE 13: Perzentil_cont (0.99) innerhalb der Gruppe ( – Avi

+1

@Avi was ist die vollständige Fehlermeldung? Ist es * über Aggregat ist nicht erlaubt auf Percentile_cont Funktion *? – GurV

+0

Dies ist die komplette Nachricht - Fehler: Syntaxfehler bei oder in der Nähe von "(" LINE 1: ...) als Networth, Perzentil_cont (0.99) innerhalb der Gruppe (Reihenfolge von ... – Avi

2

Ich möchte darauf hinweisen, dass Sie für diese eine Unterabfrage nicht brauchen:

select c.lname, sum(t.amount) as networth, 
     percentile_cont(0.99) within group (order by sum(t.amount)) over (partition by lname) 
from customer c inner join 
    account a 
    on c.customerid = a.customerid inner join 
    transaction t 
    on a.accountid = t.accountid 
group by c.lname 
order by networth; 

Auch wenn Tabellenaliasnamen (die immer sein sollte), Tabellenkürzel sind viel einfacher zu verstehen als beliebige Buchstaben.

+0

Ich bekomme die Folgender Fehler, wenn ich das versuche. BTW Ich bin Postgres 9.3.15. Ich weiß nicht, ob das hilft. FEHLER: Syntaxfehler bei oder nahe "(" LINE 1: ...) als Networth, Perzentil_cont (0.99) innerhalb der Gruppe (order by .. – Avi

+0

@Avi.. Wird es ohne die 'percentile_cont()' ausgeführt? –

+0

Nein, tut es nicht. – Avi

0

Das stolperte mich auch.

Es stellt sich heraus, percentile_cont wird in Postgres 9.3 nicht unterstützt, nur in 9.4 +.

https://www.postgresql.org/docs/9.4/static/release-9-4.html

So haben Sie etwas zu verwenden:

with ordered_purchases as (
    select 
     price, 
     row_number() over (order by price) as row_id, 
     (select count(1) from purchases) as ct 
    from purchases 
) 

select avg(price) as median 
from ordered_purchases 
where row_id between ct/2.0 and ct/2.0 + 1 

Diese Abfrage Pflege https://www.periscopedata.com/blog/medians-in-sql (Abschnitt: "Median auf Postgres")

Verwandte Themen