我正在讀取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)
會怎麼樣? 簡單解釋任何人?
我正在讀取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)
會怎麼樣? 簡單解釋任何人?
想象的那樣桶,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個桶的情況下的用法
瞭解,謝謝!你用類比解釋有助於解釋 – 10e5x
它會按照標記的降序排列數據,然後將其分成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
謝謝,你的回答有助於我理解! – 10e5x
我非常頻繁地使用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是可選的。
在Ntile函數中,首先計算行數並將其除以在ntile中傳遞的參數,然後根據商數將它們排成相同的行組,然後將剩下的行從頂部的每個組分配以不同的方式移動,例如,如果group1有4行,那麼它將佔用組中的第5行而不是最後一行。
由於
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()函數中指定的數字
如果你在一個大集合上進行NTILE,你可以使用上界的最小值(或下界的最大值)作爲中位數的代表。這比在很多行上運行中位數要便宜。 – ouonomos