web-dev-qa-db-ja.com

SQLで行をランダムに選択する方法は?

私はMSSQL Server 2005を使用しています。私のデータベースには、2つの列「Id」と「Name」とおよその列を持つ「customerNames」というテーブルがあります。 1,000件の結果。

毎回ランダムに5人の顧客を選択する必要がある機能を作成しています。クエリが実行されるたびにランダムな5行(IdおよびName)を取得するクエリの作成方法を教えてもらえますか?

187
Prashant
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()

とはいえ、皆さんの質問に対するより一般的な回答を求めて、誰もがこのページに来ているようです。

SQLでランダムな行を選択する

MySQLでランダムな行を選択します。

SELECT column FROM table
ORDER BY Rand()
LIMIT 1

PostgreSQLでランダムな行を選択します。

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Microsoft SQL Serverでランダムな行を選択します。

SELECT TOP 1 column FROM table
ORDER BY NEWID()

IBM DB2でランダムな行を選択します

SELECT column, Rand() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

Oracleでランダムレコードを選択します。

SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1

Sqliteでランダムな行を選択します。

SELECT column FROM table 
ORDER BY RANDOM() LIMIT 1
557
Curtis Tasker
SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()
34
Cody Caughlan

多分 このサイト が助けになるでしょう。

クリックスルーしたくない人のために:

SELECT TOP 1 column FROM table
ORDER BY NEWID()
8
Joe

誰かがPostgreSQLソリューションを望んでいる場合:

select id, name
from customer
order by random()
limit 5;
8
Barry Brown

ここには、ニースのMicrosoft SQL Server 2005固有のソリューションがあります。大きな結果セットで作業している場合の問題を処理します(私が知っている質問ではありません)。

大きなテーブルから行をランダムに選択する http://msdn.Microsoft.com/en-us/library/cc441928.aspx

6
johnc

これは古い質問ですが、多数の行があるテーブルに新しいフィールド(NEWID()またはORDER BY Rand()のいずれか)を適用しようとすると、非常にコストがかかります。インクリメンタルな一意のIDがある場合(そして穴がない場合)、GUIDまたはすべての単一行に類似するものを適用してから選択するIDのX#を計算する方が効率的です。トップXの#。

DECLARE @maxValue int = (select max(id) from [TABLE])
DECLARE @minValue int = (select min(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)

さらに多くの行を選択する場合は、IDとRand()値の束を#tempTableに設定し、各Rand()値を使用してmin-max値にスケーリングすることを検討します。そうすれば、@ randomId1 ... nパラメーターのすべてを定義する必要はありません。以下の例では、cteを使用して初期テーブルにデータを入力しています。

DECLARE @NumItems int = 100;

DECLARE @maxValue int = (select max(id) from [TABLE])
DECLARE @minValue int = (select min(id) from [TABLE])

with cte (n) as (select 1 union all select n+1 from cte where n < @NumItems)
select cast( ((@maxValue + 1) - @minValue) * Rand(cast(newid() as varbinary(100))) + @minValue as int) as tp into #Nt
from 
cte
select * from  #Nt ntt
inner join [TABLE] i 
        on i.id = ntt.tp
drop table #Nt
4
RIanGillis

SELECT * FROM TABLENAME ORDER BY random()LIMIT 5;

4
Narendra

これはビッグデータに最適であることがわかりました。

`SELECT TOP 1 Column_Name FROM dbo.Table TABLESAMPLE(1 PERCENT);`

TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT)はランダムですが、正しいサンプルサイズを取得するにはTOP nを追加する必要があります。

NEWID()の使用は、大きなテーブルでは非常に遅くなります。

3
Billy

数百万行のテーブルがあり、パフォーマンスに注意を払っている場合、これはより良い答えかもしれません。

SELECT * FROM Table1
WHERE (ABS(CAST(
  (BINARY_CHECKSUM
  (keycol1, NEWID())) as int))
  % 100) < 10

https://msdn.Microsoft.com/en-us/library/cc441928.aspx

3
Tohid

この記事 で説明したように、SQL結果セットをシャッフルするには、データベース固有の関数呼び出しを使用する必要があります。

RANDOM関数を使用して大きな結果セットをソートすると、非常に遅くなることがあるので、小さな結果セットでそれを行うようにしてください。

大きな結果セットをシャッフルして、後で制限する必要がある場合は、 Oracle SAMPLE(N) またはTABLESAMPLE in SQL Server または PostgreSQL in random function in ORDER BY句。

したがって、次のデータベーステーブルがあると仮定します。

enter image description here

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      |

ORDER BY句で使用されるDBMS_RANDOM.VALUE関数呼び出しのおかげで、曲はランダムな順序でリストされていることに注意してください。

SQLサーバー

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) |

ORDER BY句で使用されるNEWID関数呼び出しのおかげで、曲はランダムな順序でリストされていることに注意してください。

PostgreSQL

PostgreSQLでは、次の例に示すように、random関数を使用する必要があります。

SELECT
    artist||' - '||title AS song
FROM song
ORDER BY random()

PostgreSQLで前述のSQLクエリを実行すると、次の結果セットが取得されます。

| 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      |

ORDER BY句で使用されるrandom関数呼び出しのおかげで、曲はランダムな順序でリストされていることに注意してください。

MySQL

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            |

ORDER BY句で使用されるRand関数呼び出しのおかげで、曲はランダムな順序でリストされていることに注意してください。

0
Vlad Mihalcea