シナリオ:
あなたはSQLServer開発者として働いています。 dbo.Customerテーブルからサンプルのランダムデータを提供するように求められます。テーブルからランダムに100行または合計データの数パーセントを提供するように求められる場合があります。必要な出力を提供するためにどのクエリを使用しますか?解決策:
前回の投稿では、テーブルから上位n行を取得する方法を学びました。選択クエリでTOPを使用して、テーブルから取得する行数またはレコードの割合を指定できます。同じTop句を使用できますが、ランダムレコードを指定するように求められます。 、最初にランダムに並べ替える必要があります。 newid()関数を句ごとに使用して、ランダムに並べ替えることができます。
サンプルデータを使用して、dbo.Customerテーブルを作成しましょう。
Create table dbo.Customer (Id int, FName VARCHAR(50), LName VARCHAR(50), CountryShortName CHAR(2)) GO insert into dbo.Customer Values ( 1,'Raza','M','PK'), (2,'Rita','John','US'), (3,'Sukhi','Singh',Null), (4,'James','Smith','CA'), (5,'Robert','Ladson','US'), (6,'Alice','John','US')
1)Order byでNewID()を使用してランダムレコードを取得する
dbo.Customerテーブルから3つのランダムレコードを取得することに関心がある場合は、以下のクエリを使用できます。
Select top 3 * From dbo.Customer order by NEWID()
SQLServerテーブルからランダムレコードを取得する方法-SQLServer/TSQLチュートリアル |
以下に示すように、必要に応じてパーセントを使用することもできます
Select top 30 percent * From dbo.Customer order by NEWID()
NewID()でトップパーセントを使用してSQLServerテーブルからランダムレコードを取得する方法-SQLServer/TSQLチュートリアル |
2)TABLESAMPLESYSTEMを使用する
Microsoft Books Onlineによると、「TABLESAMPLE SYSTEMは行のおおよそのパーセンテージを返し、テーブル内の物理的な8 KBページごとにランダムな値を生成します。ページのランダムな値とクエリで指定されたパーセンテージに基づいて、ページはサンプルに含まれるか除外されます。含まれる各ページは、サンプル結果セットのすべての行を返します。」
ここから、ページ数が少ない小さなテーブルがある場合は、 TableSampleはページ全体を含むか除外するため、使用したくない場合があります。テーブルにレコードが少ない場合は、メソッド1を使用し、大きなテーブルの場合はTableSampleを使用できます。
dbo.Customerテーブルで以下のクエリを実行すると、レコードが取得されない場合があります。レコードを取得すると、単一のページに配置されたすべてのレコードが返されます。
Select * From dbo.Customer tablesample (30 percent)
以下に示すように、テーブルサンプルで必要な行を使用することもできます。返される行は異なる場合があります。 selectクエリでtopnを使用して、それらを制限できます。
Select * From dbo.Customer tablesample (2 rows)
合計6行のdbo.Customerテーブルで上記のクエリを実行したとき。行が返されないか、6つすべてが返されました。
制限する場合は、以下のクエリを使用できます。繰り返しになりますが、複数のデータページにデータがある大きなテーブルでTableSampleを使用することをお勧めします。
Select top 2 * From dbo.Customer tablesample (2 rows)