it-swarm.com.de

Generiere einen zufälligen int-Wert von 3 bis 6

Ist es in Microsoft SQL Server möglich, einen zufälligen int-Wert von Min bis Max zu generieren (3-9 Beispiel, 15-99 e.t.c)

Ich weiß, ich kann von 0 bis Max erzeugen, aber wie kann man die Min-Grenze erhöhen?

Diese Abfrage generiert einen zufälligen Wert von 1 bis 6. Sie müssen ihn von 3 auf 6 ändern.

SELECT table_name, 1.0 + floor(6 * Rand(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables

5 Sekunden später hinzugefügt :

Dumme Frage, sorry ...

SELECT table_name, 3.0 + floor(4 * Rand(convert(varbinary, newid()))) magic_number 
FROM information_schema.tables
75
FSou1

Dies erzeugt eine Zufallszahl zwischen 0 und 9

ABS(CHECKSUM(NEWID()) % 10)

1 bis 6

ABS(CHECKSUM(NEWID()) % 6) + 1

3 bis 6

ABS(CHECKSUM(NEWID()) % 4) + 3

Aktualisiert basierend auf Kommentaren: 

  • NEWID generiert eine zufällige Zeichenfolge (für jede Zeile) 
  • CHECKSUM nimmt den Wert von Zeichenfolge und erstellt eine Nummer
  • modulus (%) dividiert durch diese Zahl und gibt den Rest zurück 
  • ABS ändert negative Ergebnisse in positive
  • dann addiere eins zum Ergebnis, um 0 Ergebnisse zu eliminieren (um einen Würfelwurf zu simulieren)
146
orgtigger

Ich sehe, Sie haben eine Antwort auf Ihre Frage in SQL Server 2008 hinzugefügt, die Sie auch tun können

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...

Ein paar Nachteile dieser Methode sind

  1. Dies ist langsamer als die NEWID()-Methode 
  2. Obwohl es einmal pro Zeile ausgewertet wird, erkennt der Abfrageoptimierer dies nicht, was zu ungeraden Ergebnissen führen kann .

ich dachte nur, ich würde es als weitere Option hinzufügen.

11
Martin Smith

Du kannst das:

DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5

SELECT CAST(((@maxval + 1) - @minval) *
    Rand(CHECKSUM(NEWID())) + @minval AS TINYINT)

Und das wurde direkt von diesem Link genommen.

7
Lamak

Schön und einfach, von Pinal Dave's Seite:

http://blog.sqlauthority.com/2007/04/29/sql-server-randomnumber-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

(Ich habe eine leichte Änderung am @ Upper vorgenommen, um die obere Zahl mit 1 zu ergänzen.)

5
Adrian Carr

Hier ist die einfache und einzige Codezeile

Verwenden Sie dazu die SQL Inbuild-Funktion Rand ().

Hier ist die Formel zum Erzeugen einer Zufallszahl zwischen zwei Zahlen (RETURN INT Range) 

Hier ist a Ihre erste Zahl (Min) und b ist die zweite Zahl (Max) im Bereich

SELECT FLOOR(Rand()*(b-a)+a)

Hinweis: Sie können auch die CAST- oder CONVERT-Funktion verwenden, um die Nummer des INT-Bereichs zu erhalten. 

(CAST (Rand () * (25-10) +10 AS INT))

Beispiel:

SELECT FLOOR(Rand()*(25-10)+10);

Hier ist die Formel zum Erzeugen einer Zufallszahl zwischen zwei Zahlen (RETURN DECIMAL Range) 

SELECT Rand()*(b-a)+a;

Beispiel:

SELECT Rand()*(25-10)+10;

Weitere Details finden Sie hier: https://www.techonthenet.com/sql_server/functions/Rand.php

4

Einfach:

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((@[email protected]+1)*Rand(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.

Sie können diesen Code für Ihre Anforderungen ändern und bearbeiten.

3
MERT DOĞAN
SELECT ROUND((6 - 3 * Rand()), 0)
1
greg121

Lamaks Antwort als Funktion:

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

Im Algemeinen:

select Rand()*(@[email protected])[email protected];

Für deine Frage:

select Rand()*(6-3)+3;

<=>

select Rand()*3+3;
0
Zeinab
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(Rand() * (@max - @min), 0);

Schritt für Schritt

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;

Beachten Sie, dass eine benutzerdefinierte Funktion die Verwendung von Rand () nicht zulässt. Eine Abhilfe hierfür (Quelle: http://blog.sqlauthority.com/2012/11/20/sql-server-using-Rand-in-user-defined-functions-udf/ ) ist das Erstellen einer zuerst ansehen.

CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT        Rand() AS seed

und erstellen Sie dann die Zufallsfunktion

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
0
Mike de Klerk