2016-08-17 3 views
2

Ich habe mehrere Tabellen, die den Namen eines Unternehmens/Attributs und ein Ranking enthalten.SQL - Gruppenwerte nach Perzentil/Merge Rankings

enter image description here

ich ein Stück Code schreiben möchten, die eine Reihe von Noten ermöglicht auf der Perzentil der Partitur in Beziehung zu den Tabellen Gesamtpunkte in bestimmte Gruppen platziert werden. Ich habe einen sehr einfachen Anwendungsfall bereitgestellt, um zu demonstrieren, nach was ich suche, indem ich eine Gruppe von 10 Unternehmen in 5 Gruppen aufspalte, aber ich möchte diese skalieren, um die 5 Gruppen auf Datensätze mit vielen Zeilen anzuwenden OHNE Werte angeben zu müssen in einer CASE-Anweisung.

enter image description here

Antwort

2

NTILE(5) OVER(ORDER BY score) könnte tatsächlich Zeilen mit dem gleichen Wert in verschiedenen Quantilen (Dies ist wahrscheinlich nicht, was Sie wollen, zumindest habe ich das nie gemocht).

Es ist ganz ähnlich wie

5 * (row_number() over (order by score) - 1)/count(*) over() 

aber wenn die Anzahl der Zeilen nicht gleichmäßig die restlichen Zeilen aufgeteilt werden kann, um den ersten quantiles hinzugefügt, wenn NTILE mit und zufällig für ROW_NUMBER.

Um alle Zeilen mit dem gleichen Wert auf den gleichen Quantils Sie Ihre eigene Berechnung tun müssen zuweisen:

5 * (rank() over (order by score) - 1)/count(*) over() 
+0

hat dies ausprobiert und es gibt einen deutlichen Unterschied zu vkps Vorschlag. In vkps Vorschlag sind die Gruppen 1 -5, in Ihrem Vorschlag sind die Gruppen 0 -4 ... Gibt es eine Möglichkeit, Ihre Methode mit den Gruppen 1 - 5 statt 0 - 4 zu reproduzieren? – hansolo

+0

Hinzufügen von '+ 1' zum Ergebnis? – dnoeth

+0

'5 * (rank() rüber (nach [Konto Punktzahl]) + 1)/count (*) over() da grp2' gibt mir 0 - 5, nur zwei Items von 7000 sind eine 5 ... vielleicht Ich bin nur Missverständnis die Lösung – hansolo

4

können Sie NTILE verwenden, um die Daten in 5 Eimer auf Punkte zu teilen. Wenn die Daten jedoch nicht in die gleiche Anzahl von Bins aufgeteilt werden können oder wenn Bindungen bestehen, hat eine der Gruppen mehr Mitglieder.

SELECT t.*, NTILE(5) OVER(ORDER BY score) as grp 
FROM tablename t 

Read more about NTILE here

+1

Oder wenn es Bindungen sind, dann ist die 'NTILE()' bins nicht das sein wird, gleiche Größe. –

+0

enthalten es in der Antwort @GordonLinoff –

+1

'NTILE' könnte tatsächlich Zeilen mit dem gleichen Wert in verschiedenen Quantilen. Wenn Sie das nicht wollen, können Sie diese Berechnung verwenden: '5 * (rank() über (nach Punktzahl) - 1)/count (*) über()' – dnoeth

2

können Sie versuchen, ROW_NUMBER() und CEILING() mit:

SELECT t.name,t.score, 
     CEILING(ROW_NUMBER() OVER(ORDER BY t.score)/2) as group 
FROM YourTable t 

Dies wird jede Gruppe von zwei in einer einzigen Gruppe unterteilen, die ROW_NUMBER() belegt wird.

+1

Biut dann müssen Sie über die Anzahl der Zeilen im Ergebnis wissen, um n Quantile erstellen zu können. – dnoeth