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?
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:
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
SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()
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()
Au cas où quelqu'un voudrait une solution PostgreSQL:
select id, name
from customer
order by random()
limit 5;
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
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
SELECT * FROM TABLENAME ORDER BY random () LIMIT 5;
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.
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
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)
ouTABLESAMPLE
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:
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 |
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.
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.
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.
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.