Est-il possible dans Microsoft SQL Server de générer une valeur int aléatoire de Min à Max (exemple 3-9, 15-99 e.t.c)
Je sais, je peux générer de 0 à Max, mais comment augmenter la frontière Min?
Cette requête génère une valeur aléatoire de 1 à 6. Besoin de la changer de 3 à 6.
SELECT table_name, 1.0 + floor(6 * Rand(convert(varbinary, newid()))) magic_number
FROM information_schema.tables
Ajouté 5 secondes plus tard :
Question stupide, désolé ...
SELECT table_name, 3.0 + floor(4 * Rand(convert(varbinary, newid()))) magic_number
FROM information_schema.tables
Cela génère un nombre aléatoire compris entre 0 et 9
ABS(CHECKSUM(NEWID()) % 10)
1 à 6
ABS(CHECKSUM(NEWID()) % 6) + 1
3 à 6
ABS(CHECKSUM(NEWID()) % 4) + 3
Mis à jour en fonction des commentaires:
NEWID
génère une chaîne aléatoire (pour chaque ligne en retour) CHECKSUM
prend la valeur de string et crée un nombre%
) est divisé par ce nombre et renvoie le reste (ce qui signifie que la valeur maximale correspond à un de moins que le nombre que vous utilisez). ABS
change les résultats négatifs en positifsJe vois que vous avez ajouté une réponse à votre question dans SQL Server 2008, vous pouvez également le faire.
SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/
FROM ...
Quelques inconvénients de cette méthode sont
NEWID()
mais juste pensé que je l'ajouterais comme une autre option.
Tu peux le faire:
DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5
SELECT CAST(((@maxval + 1) - @minval) *
Rand(CHECKSUM(NEWID())) + @minval AS TINYINT)
Et cela a été pris directement à partir de ce lien , je ne sais pas vraiment comment donner un crédit pour cette réponse.
Sympa et simple, sur le site de Pinal Dave:
http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 3 ---- The lowest random number
SET @Upper = 7 ---- One more than the highest random number
SELECT @Random = ROUND(((@Upper - @Lower -1) * Rand() + @Lower), 0)
SELECT @Random
(J'ai légèrement modifié le @ Supérieur pour inclure le nombre supérieur, ajouté 1.)
Voici la simple et unique ligne de code
Pour cela, utilisez la fonction SQL Inbuild Rand ().
Voici la formule pour générer un nombre aléatoire entre deux nombres (plage RETURN INT)
Ici a est votre premier nombre (Min) et b est le deuxième nombre (Max) dans la plage
SELECT FLOOR(Rand()*(b-a)+a)
Remarque: Vous pouvez également utiliser la fonction CAST ou CONVERT pour obtenir le numéro de plage INT.
(CAST (Rand () * (25-10) +10 AS INT))
Exemple:
SELECT FLOOR(Rand()*(25-10)+10);
Voici la formule pour générer un nombre aléatoire entre deux nombres (plage RETURN DECIMAL)
SELECT Rand()*(b-a)+a;
Exemple:
SELECT Rand()*(25-10)+10;
Pour plus de détails, consultez: https://www.techonthenet.com/sql_server/functions/Rand.php
Simplement:
DECLARE @MIN INT=3; --We define minimum value, it can be generated.
DECLARE @MAX INT=6; --We define maximum value, it can be generated.
SELECT @MIN+FLOOR((@MAX-@MIN+1)*Rand(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.
Vous pouvez changer et éditer ce code selon vos besoins.
SELECT ROUND((6 - 3 * Rand()), 0)
Lamak's réponse en fonction:
-- Create RANDBETWEEN function
-- Usage: SELECT dbo.RANDBETWEEN(0,9,Rand(CHECKSUM(NEWID())))
CREATE FUNCTION dbo.RANDBETWEEN(@minval TINYINT, @maxval TINYINT, @random NUMERIC(18,10))
RETURNS TINYINT
AS
BEGIN
RETURN (SELECT CAST(((@maxval + 1) - @minval) * @random + @minval AS TINYINT))
END
GO
En général:
select Rand()*(@upper-@lower)+@lower;
Pour ta question:
select Rand()*(6-3)+3;
<=>
select Rand()*3+3;
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(Rand() * (@max - @min), 0);
Pas à pas
DECLARE @min INT = 3;
DECLARE @max INT = 6;
DECLARE @Rand DECIMAL(19,4) = Rand();
DECLARE @difference INT = @max - @min;
DECLARE @chunk INT = ROUND(@Rand * @difference, 0);
DECLARE @result INT = @min + @chunk;
SELECT @result;
Notez qu'une fonction définie par l'utilisateur n'autorise donc pas l'utilisation de Rand (). Une solution de contournement pour cela (source: http://blog.sqlauthority.com/2012/11/20/sql-server-using-Rand-in-user-defined-functions-udf/ ) consiste à créer un voir en premier.
CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT Rand() AS seed
puis créer la fonction aléatoire
CREATE FUNCTION udf_RandomNumberBetween
(
@min INT,
@max INT
)
RETURNS INT
AS
BEGIN
RETURN @min + ROUND((SELECT TOP 1 seed FROM vw_RandomSeed) * (@max - @min), 0);
END