2013-01-16 10 views
32

Czytałem o funkcji RANKING dla ms sql. Rozumiem pozostałe funkcje oprócz NTILE(). Powiedzmy, jeśli mam te dane:Chcesz dowiedzieć się więcej na temat NTILE()

StudentID  MARKS 
     S1   75 
     S2   83 
     S3   91 
     S4   83 
     S5   93 

Więc jeśli mogę zrobić NTILE(2) OVER(ORDER BY MARKS desc) Jaki będzie wynik i dlaczego?
A co, jeśli jest to NTILE(3)? Proste wyjaśnienie ktoś?

+0

Jeśli robisz NTILE na dużym zestawie, ty może użyć wartości minimalnej górnej ntile (lub maksimum niższej) jako pośrednika dla mediany. Może to być tańsze niż prowadzenie mediany w wielu rzędach. – ouonomos

Odpowiedz

34

myśleć o tym jak wiadra, ntile (2) sprawi, 2 wiadra, pół wiersze będzie miał wartość 1, a druga połowa wartości 2

przykład

create table #temp(StudentID char(2), Marks int) 
insert #temp values('S1',75) 
insert #temp values('S2',83) 
insert #temp values('S3',91) 
insert #temp values('S4',83) 
insert #temp values('S5',93) 


select NTILE(2) over(order by Marks),* 
from #temp 
order by Marks 

Oto wynik, ponieważ masz nierówną liczbę wierszy, wiadro 1 będzie miał 1 rząd bardziej

1 S1 75 
1 S2 83 
1 S4 83 
2 S3 91 
2 S5 93 

Jeśli dodać jeszcze jeden wiersz

insert #temp values('S6',92) 

Teraz oba wiadra posiada 3 rzędy

1 S1 75 
1 S2 83 
1 S4 83 
2 S3 91 
2 S6 92 
2 S5 93 

W rzeczywistości nigdy nie używałem NTILE w kodzie produkcyjnym, ale widzę zastosowanie, w którym trzeba podzielić wyniki na n liczby wiader

+0

Zrozumiano, dziękuję! Twoje wyjaśnienie z pomocą analogii pomaga – 10e5x

16

Układa dane w malejącej kolejności znaków, a następnie dzieli je na 2 grupy.

Jeśli danych nie można podzielić na równe grupy, to pierwszych kilka grup będzie miało więcej wierszy niż te ostatnie.

Więc ntile (2) daje

StudentID  MARKS  NTILE 
     S5   93   1 
     S3   91   1 
     S2   83   1 
     S4   83   2 
     S1   75   2 

Podobnie ntile (3) daje

StudentID  MARKS  NTILE 
     S5   93   1 
     S3   91   1 
     S2   83   2 
     S4   83   2 
     S1   75   3 
+0

Dzięki, Twoja odpowiedź pomoże mi zrozumieć! – 10e5x

5

Używam NTILE dość często, aby podzielić listy e-mailowe na wiadra na testy 10/10/80. Na przykład testujemy temat wiadomości e-mail i chcemy wysłać jedną z dwóch opcji do 10% każdej z list, a ta, która działa lepiej, jest wysyłana do pozostałych 80%.

SELECT [elementów listy] (ntile (10), przez (BY newid())) - 1, jak segment z [dane]

"porządek przez newid()" zapewnia sposób losowy. Składnia "[NTILE ...] - 1" jest bezpośrednim wynikiem niektórych innych narzędzi, z których korzystamy podczas analizowania tekstu, a nie z matematyki całkowitej, dlatego łatwiej było uzyskać wyniki od 0 do 9, a nie 1-10 . Pole segmentu zostanie wypełnione wartością z zakresu od 0 do 9, za pomocą których mogę dość łatwo oddzielić 10% rekordów i więcej niż raz w przypadku kampanii z wieloma staraniami.

Jeśli potrzebujesz zapytania z możliwymi do powielenia wynikami, musisz użyć czegoś deterministycznego w klauzuli "sortuj według" lub dodaj kolumnę z identyfikatorem GUID do użycia dla klauzuli order by.

Klauzula PARTITION BY służy do tworzenia grup kubełków na podstawie stanu, zawodu lub innej określonej grupy, np. NTILE (10) OVER (PARTYCJI WEDŁUG stanu State ORDER()) lub niektórych takich.Uważam, że klauzula ORDER BY jest wymagana - PARTITION BY jest opcjonalna.

0

W funkcji Ntile najpierw policz liczbę rzędów i podziel ją przez parametr przekazany w ntile, a następnie utwórz równą grupę rzędów według ilorazu i ustaw je, a następnie pozostałe wiersze zostaną rozdzielone przez każdą grupę od góry w trybie przesuwania i nie odbierze go z najmniejszych rzędów, np. jeśli grupa 1 ma 4 wiersze, to zajmie 5 wiersz w swojej grupie, a nie ostatni wiersz.

Dzięki

0

ntile bez USING partycji tylko podziału zbioru danych w oparciu o numer w ntile (liczby), tak że: jeśli liczba rzędów 7 są, na przykład: 1,1,1,2,3 , 4,5 ntile (3) daje 3,2,2. Jak dostałem 3,2,2 ?. Najpierw przyjmij 7 jako 6 (jeden mniej, aby go wyrównać), 6/3 daje 2,2,2, następnie dodaj +! do pierwszej partycji. Jeśli liczba wierszy jest równa, wtedy nie ma problemu. po prostu podziel zbiór danych:

Ntile używając klauzuli partition, wystarczy podzielić zestaw danych na podstawie wartości w zestawie danych tak, aby: jeśli żaden z wierszy nie wynosił 7, przykładowe wartości wierszy to: 1,1,1,2,3,4, 5 następnie: ntile (3) podzielone przez wartość da: 1,2,3,1,1,1,1. Jak to dostałem ?. Najpierw przerwij zbiór danych na podstawie wartości: tutaj 1,1,1 to jedna strona, następne wszystkie wartości tworzą inną partycję. Następnie zacznij przypisywać stopień ntile każdej partycji. Tutaj 1,1,1 stanie się 1,2,3, a następnie kontynuacją z następną partycją, możesz ciągnąć rangę tylko do liczby określonej w funkcji ntile()

Powiązane problemy