2011-04-17

使用 NEWID() 函數,隨機、亂數(random)選取 N 筆資料列;亂數排序

使用 NEWID() 函數,隨機、亂數(random)選取 N 筆資料列

請參考以下的範例程式碼:

USE Northwind
GO
-- 回傳有 91 筆客戶資料
SELECT COUNT(*) N'資料列筆數' FROM Northwind.dbo.Customers

--EX1. 以隨機、亂數的排序方式,顯示全部的客戶資料
SELECT  CustomerID, Phone
FROM Northwind.dbo.Customers
ORDER BY NEWID()

SELECT  NEWID() N'rowid', CustomerID, Phone
FROM Northwind.dbo.Customers
ORDER BY rowid
GO




--EX2. 以隨機、亂數方式,抽取 5 筆客戶的資料列
SELECT  TOP 5 CustomerID, Phone
FROM Northwind.dbo.Customers
ORDER BY NEWID()

SELECT  TOP 5 NEWID() N'rowid', CustomerID, Phone
FROM Northwind.dbo.Customers
ORDER BY rowid;
GO




--EX3. 以隨機、亂數方式,抽取 5 筆客戶的資料列,並加入排名編號
DECLARE @tbTOP5 TABLE (rid INT IDENTITY(1,1), CustomerID nchar(5), Phone nvarchar(24))

INSERT @tbTOP5 
 SELECT  TOP (5) CustomerID, Phone
 FROM Northwind.dbo.Customers
 ORDER BY NEWID()

SELECT * FROM @tbTOP5
GO




--EX4. 以隨機、亂數方式,抽取 N 筆客戶的資料列,並加入排名編號,以使用預存程序為例
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[randomNCustomer1]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[randomNCustomer1]
GO
CREATE PROCEDURE randomNCustomer1
 @cnt INT
AS
DECLARE @tbTOP5 TABLE (rid INT IDENTITY(1,1), CustomerID nchar(5), Phone nvarchar(24))

INSERT @tbTOP5 
 SELECT  TOP (@cnt) CustomerID, Phone
 FROM Northwind.dbo.Customers
 ORDER BY NEWID()

SELECT * FROM @tbTOP5
GO

-- 執行此預存程序,隨機、亂數查詢 N 筆客戶的資料列,例如:N = 10
EXEC dbo.randomNCustomer1 10





認識 NEWID() 函數

NEWID() 函數會產生 uniqueidentifier 資料類型的唯一資料

uniqueidentifier 資料類型中儲存做為全域唯一識別碼 (GUID) 使用的 16 位元組二進位值。

GUID 是一種唯一的二進位數字;全世界的電腦都不會產生重複的 GUID 值。

GUID 的主要用途是在有許多站台與許多電腦的網路上指派一個唯一識別碼

Transact-SQL 函數、應用程式 API 函數及方法會根據網路卡的識別碼加上從 CPU 時鐘取得的唯一數字產生 uniqueidentifier 新值。

每片網路卡都有唯一的識別碼。

NEWID 傳回的 uniqueidentifier 值是使用伺服器上的網路卡所產生的。

應用程式 API 函數與方法傳回的 uniqueidentifier 值是使用用戶端上的網路卡所產生的。


參考資料:
認識 TABLESAMPLE 子句;快速從大型資料表傳回取樣的資料列
http://sharedderrick.blogspot.com/2011/04/tablesample.html

對 uniqueidentifier 資料類型的資料行,設定其「預設值(Default)」為 0,也就是 00000000-0000-0000-0000-000000000000
http://sharedderrick.blogspot.com/2011/01/uniqueidentifier-default-0-00000000.html

NEWID (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms190348.aspx

使用 Uniqueidentifier 資料
http://msdn.microsoft.com/zh-tw/library/ms190215.aspx

uniqueidentifier (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms187942.aspx

沒有留言:

張貼留言