Comment choisir 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 "Name" et environ. 1000 résultats.

je crée une fonctionnalité Où je dois choisir 5 clients au hasard à chaque fois. Est-ce que quelqu'un peut me dire comment créer une requête qui obtiendra random 5 lignes (Id, et Nom) chaque fois que la requête est exécutée?

163
demandé sur Kate Gregory 2009-02-24 09:14:12

9 réponses

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

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

sélectionner une rangée aléatoire en SQL

sélectionner une ligne au hasard avec MySQL:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

sélectionner une ligne au hasard avec PostgreSQL:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

sélectionnez une rangée 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électionner un enregistrement aléatoire avec Oracle:

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

sélectionner une rangée au hasard avec sqlite:

SELECT column FROM table 
ORDER BY RANDOM() LIMIT 1
498
répondu Curtis Tasker 2017-01-13 21:19:04
SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()
33
répondu Cody Caughlan 2009-02-24 06:21:37

dans le cas où quelqu'un veut une solution PostgreSQL:

select id, name
from customer
order by random()
limit 5;
8
répondu Barry Brown 2009-02-24 06:45:56

Peut-être ce site seront d'une aide.

pour ceux qui ne veulent pas cliquer:

SELECT TOP 1 column FROM table
ORDER BY NEWID()
7
répondu Joe 2009-02-24 06:21:20

Il ya une solution spécifique Microsoft SQL Server 2005 ici. Traite du problème où vous travaillez avec un ensemble de résultats grand (pas la question que je sais).

sélectionner des lignes au hasard à partir d'une grande Table http://msdn.microsoft.com/en-us/library/cc441928.aspx

5
répondu johnc 2012-09-23 12:17:51

j'ai trouvé que cela fonctionne 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 il faut ajouter le TOP n pour obtenir la taille d'échantillon correcte.

en utilisant NEWID() est très lent sur les grandes tables.

3
répondu Billy 2013-08-15 23:08:59

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

3
répondu Narendra 2015-02-25 07:49:41

si vous avez un tableau avec des millions de lignes et 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

1
répondu Tohid 2018-03-03 22:14:37

C'est une vieille question, mais tenter d'appliquer un nouveau champ (NEWID() ou ORDER BY rand()) à une table avec un grand nombre de lignes serait prohibitif. Si vous avez des ID incrémentiels, uniques (et n'avez pas de trous), il sera plus efficace de calculer le X # D'IDs à sélectionner au lieu d'appliquer une GUID ou similaire à chaque ligne simple et puis de prendre le x # de haut.

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 vouliez sélectionner beaucoup plus de lignes, je voudrais cherchez à peupler un # tempTable avec un ID et un tas de valeurs de rand() puis en utilisant chaque valeur de rand() à l'échelle des valeurs min-max. De cette façon, vous n'avez pas à définir tout le @randomId1...n paramètres. J'ai inclus un exemple ci-dessous en utilisant un cte pour peupler la table initiale.

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
1
répondu RIanGillis 2018-07-18 02:30:41