SQL server 之隨機函數NEWID()和RAND()

一、

我們團隊最近爲旅行包組織完成了一個項目,因爲這個項目,我們受到了很多客戶熱情洋溢的感謝信和E-mail。我們將這些讚揚保存在一個稱之爲Kudos的榮譽表中。

在網站設計階段,我們決定利用Kudos表在網站上顯示客戶的反饋信息。而顯示的時候只需要10條記錄,但是我們不希望只能顯示那固定的幾條反饋信息,因爲它有些惱人並且需要維護。所以我們選擇隨機方法挑出10條記錄。將在下面給你講解在SQL Server中如何產生隨機集。

因爲你沒有這個名叫Kudos的表,那我們就選用SQL Server有的Northwind表作爲示例。很明顯T-SQL函數不能滿足這個要求:

useNorthwind

select rand(), productid, productname from Products

這個方法的問題在於Rand()函數在給定命令裏所有行都返回相同的值,見Listing A

你可能不需要得到這樣的結果,則可以給rand()函數提供一個種子值。在下面的代碼中,我們在Rand()函數中給定每一行的productid作爲種子值。

select top 10
rand(productid) as row, productid, productname

from Products

order by row

返回的結果見Listing B.

不論這個命令運行多少次,雖然隨機指派的行返回唯一的值,但是我們的得到的productids數字是10進制的。這個方法還沒有起作用。

但是,這裏提供了另外一個更有用的函數:NewID(),它返回一個GUID(全局唯一標誌符)。我們看看Rand()函數被NewID()函數代替後的結果怎麼樣:

select top 10
newid() as row, productid, productname

from Products

order by row

運行的結果與Listing C中的結果很相似。

你的結果有點不同,因爲NewID()在每一次調用的時候都產生一個GUID,因此,如果將上面的命令運行2到3次,得到的結果是不同的。

這個方法是調用NewID()的值作爲一列,然後通過NewID()排列這些值。此方法很簡單,並且可以應用到不同的場合。例如:你可能需要創建一些有某種特性的產品的列表或隨機挑選10個客戶或者100個隨機挑選出來的訂單的詳細資料等。

SQL Server不是設計用於產生隨機集的,但是其設計是基於數學而非商學的。幸虧有NewID()函數,我們才能夠毫不費力地產生隨機數據集。

二、

延伸閱讀

sql server的隨機函數newID()和RAND()  

  Select * FROM Northwind..Orders orDER BY NEWID() ------隨機排序

  Select TOP 10 * FROM Northwind..Orders orDER BY NEWID() ------從Orders表中隨機取出10條記錄  

  示例  

  A、對變量使用 NEWID 函數

  以下示例使用 NEWID() 對聲明爲 uniqueidentifier 數據類型的變量賦值。在測試 uniqueidentifier 數據類型變量的值之前,先輸出該值。

  -- Creating a local variable with DECLARESET syntax.

  DECLARE @myid uniqueidentifier

  SET @myid = NEWID()

  PRINT 'Value of @myid is '+ CONVERT(varchar(255), @myid)

  下面是結果集:

  Value of @myid is 6F9619FF-8B86-D011-B42D-00C04FC964FF

  注意:

  NEWID 對每臺計算機返回的值各不相同。所顯示的數字僅起解釋說明的作用。  

  隨機函數:rand()

  在查詢分析器中執行:select rand(),可以看到結果會是類似於這樣的隨機小數:0.36361513486289558,像這樣的小數在實際應用中用得不多,一般要取隨機數都會取隨機整數。那就看下面的兩種隨機取整數的方法:   

  1、

  A:select floor(rand()*N) ---生成的數是這樣的:12.0

  B:select cast( floor(rand()*N) as int) ---生成的數是這樣的:12   

  2、

  A:select ceiling(rand() * N) ---生成的數是這樣的:12.0

  B:select cast(ceiling(rand() * N) as int) ---生成的數是這樣的:12   

  其中裏面的N是一個你指定的整數,如100,可以看出,兩種方法的A方法是帶有.0這個的小數的,而B方法就是真正的整數了。

大致一看,這兩種方法沒什麼區別,真的沒區別?其實是有一點的,那就是他們的生成隨機數的範圍:

  方法1的數字範圍:0至N-1之間,如cast( floor(rand()*100) as int)就會生成0至99之間任一整數

  方法2的數字範圍:1至N之間,如cast(ceiling(rand() * 100) as int)就會生成1至100之間任一整數

  對於這個區別,看SQL的聯機幫助就知了:  

  比較 CEILING 和 FLOOR

  CEILING 函數返回大於或等於所給數字表達式的最小整數。FLOOR 函數返回小於或等於所給數字表達式的最大整數。例如,對於數字表達式 12.9273,CEILING 將返回 13,FLOOR 將返回 12。FLOOR 和 CEILING 返回值的數據類型都與輸入的數字表達式的數據類型相同。

  現在,各位就可以根據自己需要使用這兩種方法來取得隨機數了^_^   

  另外,還要提示一下各位朋友,關於隨機取得表中任意N條記錄的方法,很簡單,就用newid():

  select top N * from table_name order by newid() ----N是一個你指定的整數,表是取得記錄的條數.

發佈了25 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章