2013-01-16 35 views
32

我正在讀取ms sql的RANKING函數。我瞭解除NTILE()之外的其他功能。 比方說,如果我有這樣的數據:想要了解更多關於NTILE()

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

所以,如果我做了什麼NTILE(2) OVER(ORDER BY MARKS desc)結果會是爲什麼?
如果是NTILE(3)會怎麼樣? 簡單解釋任何人?

+0

如果你在一個大集合上進行NTILE,你可以使用上界的最小值(或下界的最大值)作爲中位數的代表。這比在很多行上運行中位數要便宜。 – ouonomos

回答

34

想象的那樣桶,NTILE(2)將2桶,一半行將具有值1,而另一半的值2

例如

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 

這裏是輸出的,因爲你有一個奇數行,鬥1將有1行更

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

如果添加多一個排

insert #temp values('S6',92) 

現在,這兩個桶有3行

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

實際上我從來沒有在生產代碼中使用過NTILE,但是我可以看到在需要將結果拆分爲n個桶的情況下的用法

+0

瞭解,謝謝!你用類比解釋有助於解釋 – 10e5x

16

它會按照標記的降序排列數據,然後將其分成2組。

如果不能將數據拆分成相等的組,則前幾組將具有比後組更多的行。

所以NTILE(2)會給你

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

同樣NTILE(3)會給你的這

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

謝謝,你的回答有助於我理解! – 10e5x

5

我非常頻繁地使用NTILE將電子郵件列表拆分成桶以進行10/10/80測試。例如,我們正在測試一封電子郵件的主題行,並且希望將兩個選項中的一個選項發送到每個列表的10%,而將其中一個更好地發送到剩下的80%。

SELECT [字段列表],(NTILE(10)OVER(由NEWID())順序) - 1 AS段FROM [數據]

「順序由NEWID()」 保證了隨機順序。 「[NTILE ...] - 1」語法是我們使用文本解析代替整數運算的其他一些工具的直接結果,所以將結果從0-9而非1-10 。細分字段將填充0-9的值,我可以用它很容易地分離出10%的記錄,並且對於對它們進行多重努力的廣告系列,可以多次使用這些值。

如果您需要帶有可複製結果的查詢,則需要在「order by」子句中使用某些確定性的操作,或者添加一個帶有GUID的列以用於order by子句。

PARTITION BY子句將用於根據狀態或行業或某些其他預定義的分組創建分組組,例如NTILE(10)OVER(通過State ORDER BY newid()分區)或其他類型。我相信ORDER BY子句是必需的 - PARTITION BY是可選的。

0

在Ntile函數中,首先計算行數並將其除以在ntile中傳遞的參數,然後根據商數將它們排成相同的行組,然後將剩下的行從頂部的每個組分配以不同的方式移動,例如,如果group1有4行,那麼它將佔用組中的第5行而不是最後一行。

由於

0

NTILE不使用分區子句,只是劃分基於NTILE(數)的數目數據集,使得:如果沒有行的是7,例如:1,1,1,2,3- ,4,5個暱稱(3)會給3,2,2。我是如何得到3,2,2的?首先假設7爲6(少一個即可),6/3給出2,2,2,然後加上+!到第一個分區。如果no.of行甚至沒有問題。只是劃分數據集

Ntile使用分區子句,只是根據數據集中的值劃分數據集,以便:如果行數爲7,則示例行值爲:1,1,1,2,3,4, 5則:按照值劃分的ntile(3)將給出:1,2,3,1,1,1,1。我是怎麼得到這個的?首先基於值打破數據集:這裏,1,1,1是一個部分,接下來所有的值形成一個不同的分區。然後開始爲每個分區分配排名。在這裏,1,1,1將變爲1,2,3然後繼續下一個分區,你可以將排名拉到ntile()函數中指定的數字

相關問題