Dado que mi enfoque para una consulta de prueba en la que trabajé en esta pregunta no funcionó, estoy intentando otra cosa ahora. ¿Hay alguna manera de decirle a la random()
función de pg que me obtenga solo números entre 1 y 10?
Dado que mi enfoque para una consulta de prueba en la que trabajé en esta pregunta no funcionó, estoy intentando otra cosa ahora. ¿Hay alguna manera de decirle a la random()
función de pg que me obtenga solo números entre 1 y 10?
Respuestas:
Si por números entre 1 y 10 te refieres a cualquier flotante que sea> = 1 y <10, entonces es fácil:
select random() * 9 + 1
Esto se puede probar fácilmente con:
# select min(i), max(i) from (
select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
min | max
-----------------+------------------
1.0000083274208 | 9.99999571684748
(1 row)
Si desea números enteros, que son> = 1 y <10, entonces es simple:
select trunc(random() * 9 + 1)
Y de nuevo, prueba simple:
# select min(i), max(i) from (
select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
min | max
-----+-----
1 | 9
(1 row)
trunc()
devuelve el mismo tipo de datos que la entrada (como se indica en el manual). trunc(random() * 20)::int
random()
devuelva un valor <1 que cuando se multiplica por 9 sería> = 9 debido a la naturaleza inexacta del tipo de precisión doble . En la práctica, incluso si es posible, sería muy improbable, por supuesto, debido a la precisión de 15 dígitos aproximadamente.
Para resumir y simplificar un poco, puede usar:
-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);
Y puedes probar esto como lo menciona @ user80168
-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;
ceil(random() * 10)
resultado 0, me apegaría floor
.
SELECT floor(random() * 10 + 1);
Si está utilizando SQL Server, la forma correcta de obtener un entero es
SELECT Cast(RAND()*(b-a)+a as int);
Dónde
(trunc (aleatorio () * 10)% 10) + 1
La versión correcta de la respuesta de hythlodayr.
-- ERROR: operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1
La salida de trunc
debe convertirse a INTEGER
. Pero se puede hacer sin él trunc
. Entonces resulta simple.
select (random() * 9)::INTEGER + 1
Genera una salida INTEGER en el rango [1, 10], es decir, tanto 1 como 10 inclusive.
Para cualquier número (flotantes), consulte la respuesta de user80168. es decir, simplemente no lo convierta a INTEGER
.
En realidad, no sé que quieras esto.
prueba esto
INSERT INTO my_table (my_column)
SELECT
(random() * 10) + 1
;
Este procedimiento almacenado inserta un número rand en una tabla. Cuidado, inserta un número infinito. Deja de ejecutarlo cuando tengas suficientes números.
crea una tabla para el cursor:
CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL)
VAMOS
Crea una tabla que contenga tus números:
CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)
INSERTAR EL GUIÓN:
INSERT INTO [SearchIndex]([Cursor]) SELECT N'INSERT INTO ID SELECT FLOOR(rand() * 9 + 1) SELECT COUNT (ID) FROM ID
CREACIÓN Y EJECUCIÓN DEL PROCEDIMIENTO:
CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare CURSE CURSOR FOR (SELECT [Cursor] FROM [dbo].[SearchIndex] WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript
WHILE @@FETCH_STATUS IS NOT NULL
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;
END
END
GO
Llena tu mesa:
EXEC RandNumbers