私はMSSQL Server 2005を使用しています。私のデータベースには、「customerNames」というテーブルがあり、「Id」と「Name」の2つの列があり、約 1,000件。
毎回ランダムに5人の顧客を選択する必要がある機能を作成しています。クエリが実行されるたびにランダムな5行(Id、およびName)を取得するクエリを作成する方法を誰かに教えてもらえますか?
私はMSSQL Server 2005を使用しています。私のデータベースには、「customerNames」というテーブルがあり、「Id」と「Name」の2つの列があり、約 1,000件。
毎回ランダムに5人の顧客を選択する必要がある機能を作成しています。クエリが実行されるたびにランダムな5行(Id、およびName)を取得するクエリを作成する方法を誰かに教えてもらえますか?
回答:
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()
とはいえ、皆さんの質問に対するより一般的な答えを求めて、誰もがこのページにアクセスするようです。
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
SELECT TOP 1 column FROM table
ORDER BY NEWID()
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
SELECT column FROM table
ORDER BY RANDOM() LIMIT 1
update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID())
-編集:私はコメントで仕事にフォーマットを取得することはできません:(
ここには、Microsoft SQL Server 2005固有の優れたソリューションがあります。大きな結果セットで作業している問題に対処します(私が知っている質問ではありません)。
大きなテーブルからランダムに行を選択する http://msdn.microsoft.com/en-us/library/cc441928.aspx
数百万行のテーブルがあり、パフォーマンスを気にしている場合、これはより良い答えになるでしょう。
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
これは古い質問ですが、新しいフィールド(NEWID()またはORDER BY rand()のいずれか)を多数の行があるテーブルに適用しようとすると、法外なコストがかかります。インクリメンタルな一意のIDがある場合(およびホールがない場合)、GUIDなどをすべての行に適用してから上位X#を取得する代わりに、選択するIDのX#を計算する方が効率的です。
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @randomId1 int, @randomId2 int, @randomId3 int, @randomId4 int, @randomId5 int
SET @randomId1 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId2 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId3 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId4 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId5 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
--select @maxValue as MaxValue, @minValue as MinValue
-- , @randomId1 as SelectedId1
-- , @randomId2 as SelectedId2
-- , @randomId3 as SelectedId3
-- , @randomId4 as SelectedId4
-- , @randomId5 as SelectedId5
select * from [TABLE] el
where el.id in (@randomId1, @randomId2, @randomId3, @randomId4, @randomId5)
さらに多くの行を選択したい場合は、#tempTableにIDと一連のrand()値を設定してから、各rand()値を使用してmin-max値にスケーリングします。そうすれば、@ randomId1 ... nパラメータをすべて定義する必要がなくなります。以下の例には、CTEを使用して初期テーブルにデータを入力します。
DECLARE @NumItems int = 100;
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @range int = @maxValue+1 - @minValue;
with cte (n) as (
select 1 union all
select n+1 from cte
where n < @NumItems
)
select cast( @range * rand(cast(newid() as varbinary(100))) + @minValue as int) tp
into #Nt
from cte;
select * from #Nt ntt
inner join [TABLE] i on i.id = ntt.tp;
drop table #Nt;
この記事で説明したように、SQL結果セットをシャッフルするには、データベース固有の関数呼び出しを使用する必要があります。
RANDOM関数を使用して大きな結果セットをソートすると、処理が非常に遅くなる場合があることに注意してください。そのため、小さな結果セットでそれを実行してください。
あなたが大きな結果セットをシャッフルし、その後、それを制限する必要がある場合、それはよりよく利用するようなものだオラクル
SAMPLE(N)
またはTABLESAMPLE
でSQL Serverのか、PostgreSQLの ORDER BY句で代わりにランダム関数の。
したがって、次のデータベーステーブルがあるとします。
そして、以下の行 song
テーブルの:
| id | artist | title |
|----|---------------------------------|------------------------------------|
| 1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
| 2 | HAIM | Don't Save Me (Cyril Hahn Remix) |
| 3 | 2Pac ft. DMX | Rise Of A Champion (GalilHD Remix) |
| 4 | Ed Sheeran & Passenger | No Diggity (Kygo Remix) |
| 5 | JP Cooper ft. Mali-Koa | All This Love |
Oracleでは、 DBMS_RANDOM.VALUE
、次の例に示すように関数。
SELECT
artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE
前述のSQLクエリをOracleで実行すると、次の結果セットが得られます。
| song |
|---------------------------------------------------|
| JP Cooper ft. Mali-Koa - All This Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
のおかげで、曲がランダムな順序でリストされていることに注意してください
DBMS_RANDOM.VALUE
ORDER BY句で使用される関数呼び出しの。
SQL ServerではNEWID
、次の例に示すように、関数を使用する必要があります。
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()
前述のSQLクエリをSQL Serverで実行すると、次の結果セットが取得されます。
| song |
|---------------------------------------------------|
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| JP Cooper ft. Mali-Koa - All This Love |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
NEWID
ORDER BY句で使用される関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。
PostgreSQLではrandom
、次の例に示すように、関数を使用する必要があります。
SELECT
artist||' - '||title AS song
FROM song
ORDER BY random()
前述のSQLクエリをPostgreSQLで実行すると、次の結果セットが取得されます。
| song |
|---------------------------------------------------|
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
random
ORDER BY句で使用される関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。
MySQLではRAND
、次の例に示すように、関数を使用する必要があります。
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()
MySQLで前述のSQLクエリを実行すると、次の結果セットが取得されます。
| song |
|---------------------------------------------------|
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
RAND
ORDER BY句で使用される関数呼び出しのおかげで、曲がランダムな順序でリストされていることに注意してください。