2016-05-29 11 views
0

Ich benutze SQL, Amazon Rotverschiebung, aber es ist sehr ähnlich zu PostGres Ich bin es gesagt.SQL Fenster Funktion Anzahl Top 10 Abfrage Postgresql Redshift

Ich habe eine Datenbank mit einer Tabelle mit vielen Fragen mit vielen Antworten. Die Fragen und Antworten werden jedes Mal dupliziert, wenn jemand diese Antwort angibt. Ich möchte eine Abfrage, die eindeutige Fragen mit Antworten auf diese Fragen enthält. Ich möchte jedoch nur die 10 am häufigsten beantworteten Antworten anzeigen.

Also was ich getan habe, ist ich habe folgendes getan. Ich benutzte eine Fensterfunktion, um die durch die Frage aufgeteilte Anzahl der Antworten anzuzeigen. Ich sortierte COUNT (Antwort) absteigend. Einige Fragen haben jedoch viele verschiedene Antworten, so dass die Abfrage Hunderte von Zeilen mit allen Antworten für diese Frage enthält. Also habe ich meinem Fenster eine Unterabfrage gestellt. Ich habe SELECT * FROM die Unterabfrage und dann in einer WHERE-Klausel außerhalb der Unterabfrage angegeben, dass das Fenster/Partition kleiner oder gleich 10 sein sollte, um Top-Ten-Antworten anzuzeigen). Das hat funktioniert.

Ich möchte jetzt den Prozentsatz jeder Antwort für jede Frage angezeigt werden. Ich kann dies mit procent_rank oder cume_dist Fensterfunktionen tun. Beide haben eine ähnliche gewünschte Wirkung.

Allerdings möchte ich auch eine Spalte hinzufügen, die den kumulativen Prozentsatz zeigt. Es sollte den Prozentsatz angeben, wie oft die Antwort gegeben wurde, im Vergleich zur Gesamtanzahl der Antworten auf diese Frage. Wenn Sie die 10 Zeilen für diese Frage hinuntergehen, sollte der Prozentsatz so aufgebaut werden, dass Sie in der zehnten Zeile auf 1,00 oder 100% enden.

Das Problem ist das folgende: Wenn eine Frage nur 10 oder weniger mögliche Antworten hat, funktioniert es tadellos. Wenn eine Frage jedoch mehr als 10 Antworten enthält, berechnet precent_rank oder cume_dist den Prozentsatz jeder Antwort basierend auf der Anzahl der Antworten. Ich kann sehen, dass das nicht falsch ist, aber ich möchte nur die Top 10 Antworten, wie oben erwähnt, und den Prozentsatz basierend auf diesen Top 10 zeigen!

Irgendein Rat, wie man die Frage erhält, um die 100 von anderen Antworten zu vergessen und nur meine Top 10 zu betrachten, die ich zeige, würde geschätzt werden.

vielen Dank my query

SELECT * FROM (SELECT question, answer, COUNT(answer), row_number() OVER (PARTITION BY question ORDER BY count ASC) AS ranker ,question as had_to_insert_an_alias, COUNT(answer), cume_dist() OVER (PARTITION BY had_to_insert_an_alias ORDER BY count DESC) AS percent_ranker FROM question_table WHERE date_field >= '2013-10-01' and date_field < '2013-10-30' group by question, answer) AS subquery WHERE ranker <= 10 order by question;

+1

Es ist ursprünglich ein Fork von PostGreSQL 8.0.2, aber es ist erheblich darunter modifiziert. Auch Ihre Frage ist sehr langwierig und wortreich. Bitte fügen Sie einige Beispieldaten * (Oder einen Link zu einem SQLFiddle) *, die gewünschten Ergebnisse und den Code, den Sie versucht haben, ein. Wenn ein Bild ein Wort wert ist, ist der tatsächliche Code mindestens ein paar hundert wert. – MatBailie

+0

Es wäre einfacher, Ihnen eine gute Antwort zu geben, wenn Sie Ihre vorhandene Abfrage und ein Beispiel für die Tabellendefinition angeben würden. – Chris

+0

Hallo, ich habe einen Screenshot mit meiner Anfrage angehängt. Es ist ein Link am Ende meiner großen Frage, nachdem ich "vielen Dank" geschrieben habe – 187213

Antwort

0

So etwas wie das?

select question, answer, count, rank, (count::decimal/total::decimal)*100.0 as percent 
from (
    select question, answer, count, rank, 
     sum(count) over (partition by question order by count) as total 
    from (
     select question, answer, count(*) as count, 
      rank() over (partition by question order by count desc) as rank 
     from question_table 
     where date_field >= '2013-10-01' and date_field < '2013-10-30' 
     group by question, answer 
    ) q 
    where rank <= 10 
) t 
order by question, rank 

Dies ist ungetestet so Syntax ausgeschaltet sein kann.