web-dev-qa-db-fra.com

Comment sélectionner au hasard des lignes en SQL?

J'utilise MSSQL Server 2005. Dans ma base de données, j'ai une table "customerNames" qui a deux colonnes "Id" et "Nom" et environ. 1000 résultats.

Je crée une fonctionnalité dans laquelle je dois sélectionner 5 clients au hasard à chaque fois. Quelqu'un peut-il me dire comment créer une requête qui obtiendra 5 lignes aléatoires (ID et Nom) à chaque exécution de la requête?

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

Cela dit, tout le monde semble venir sur cette page pour une réponse plus générale à votre question:

Sélection d'une ligne aléatoire dans SQL

Sélectionnez une ligne aléatoire avec MySQL:

SELECT column FROM table
ORDER BY Rand()
LIMIT 1

Sélectionnez une ligne aléatoire avec PostgreSQL:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Sélectionnez une ligne aléatoire avec Microsoft SQL Server:

SELECT TOP 1 column FROM table
ORDER BY NEWID()

Sélectionner une ligne aléatoire avec IBM DB2

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

Sélectionnez un enregistrement aléatoire avec Oracle:

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

Sélectionnez une ligne aléatoire avec sqlite:

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

Peut-être que ce site vous sera utile.

Pour ceux qui ne veulent pas cliquer à travers:

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

Au cas où quelqu'un voudrait une solution PostgreSQL:

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

Il existe ici une solution spécifique à Nice Microsoft SQL Server 2005. Traite le problème où vous travaillez avec un jeu de résultats volumineux (pas la question que je connais).

Sélection aléatoire de lignes dans une grande table http://msdn.Microsoft.com/en-us/library/cc441928.aspx

6
johnc

C'est une vieille question, mais essayer d'appliquer un nouveau champ (NEWID () ou ORDER BY Rand ()) à une table avec un grand nombre de lignes serait prohibitif. Si vous avez des identifiants uniques et incrémentiels (et ne comportent pas de trous), il sera plus efficace de calculer le X # d'identifiants à sélectionner au lieu d'appliquer un GUID ou similaire à chaque ligne, puis de prendre le X supérieur de.

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)

Si vous souhaitez sélectionner beaucoup plus de lignes, je voudrais renseigner une #tempTable avec un ID et un tas de valeurs Rand (), puis utiliser chaque valeur Rand () pour mettre à l'échelle les valeurs min-max. Ainsi, vous n'avez pas à définir tous les paramètres @ randomId1 ... n. J'ai inclus un exemple ci-dessous en utilisant un cte pour remplir le tableau initial.

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

J'ai trouvé que cela fonctionnait mieux pour le Big Data.

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

TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT) est aléatoire, mais vous devez ajouter le TOP n pour obtenir la taille d'échantillon correcte.

L'utilisation de NEWID() est très lente sur les grandes tables.

3
Billy

Si vous avez une table avec des millions de lignes et que vous vous souciez de la performance, cela pourrait être une meilleure réponse:

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

Comme je l'ai expliqué dans cet article , pour mélanger le jeu de résultats SQL, vous devez utiliser un appel de fonction spécifique à la base de données.

Notez que le tri d'un ensemble de résultats volumineux à l'aide d'une fonction RANDOM peut s'avérer très lent. Veillez donc à le faire pour de petits ensembles de résultats.

Si vous devez mélanger un ensemble de résultats volumineux et le limiter ensuite, il est préférable d'utiliser quelque chose comme Oracle SAMPLE(N) ou TABLESAMPLE dans SQL Server ou PostgreSQL au lieu d'une fonction aléatoire dans la clause ORDER BY.

Donc, en supposant que nous ayons la table de base de données suivante:

enter image description here

Et les lignes suivantes dans la table 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

Sur Oracle, vous devez utiliser la fonction DBMS_RANDOM.VALUE, comme illustré dans l'exemple suivant:

SELECT
    artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE

Lors de l'exécution de la requête SQL susmentionnée sur Oracle, nous allons obtenir l'ensemble de résultats suivant:

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

Notez que les morceaux sont listés dans un ordre aléatoire, grâce à l'appel de fonction DBMS_RANDOM.VALUE utilisé par la clause ORDER BY.

Serveur SQL

Sur SQL Server, vous devez utiliser la fonction NEWID, comme illustré dans l'exemple suivant:

SELECT
    CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()

Lors de l'exécution de la requête SQL susmentionnée sur SQL Server, nous allons obtenir l'ensemble de résultats suivant:

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

Notez que les morceaux sont listés dans un ordre aléatoire, grâce à l'appel de fonction NEWID utilisé par la clause ORDER BY.

PostgreSQL

Sous PostgreSQL, vous devez utiliser la fonction random, comme illustré par l'exemple suivant:

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

Lors de l'exécution de la requête SQL susmentionnée sur PostgreSQL, nous allons obtenir l'ensemble de résultats suivant:

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

Notez que les morceaux sont listés dans un ordre aléatoire, grâce à l'appel de fonction random utilisé par la clause ORDER BY.

MySQL

Sous MySQL, vous devez utiliser la fonction Rand, comme illustré dans l'exemple suivant:

SELECT
  CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY Rand()

Lors de l'exécution de la requête SQL susmentionnée sur MySQL, nous allons obtenir l'ensemble de résultats suivant:

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

Notez que les morceaux sont listés dans un ordre aléatoire, grâce à l'appel de fonction Rand utilisé par la clause ORDER BY.

0
Vlad Mihalcea