Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно сделать выборку N случайных чисел одним запросом?  [new]
makondo
Member

Откуда:
Сообщений: 428
Я пробовал через рекурсивный

WITH a as ( SELECT n, RAND() as r
UNION ALL
SELECT n+1, RAND()
WHERE n<=1000 ) ... c RAND() , но после 2го случайного числа идут одинаковые числа - последний, второй рэндом становится константой.


--
У мудрого человека нет врагов - только учителя
31 июл 15, 14:54    [17960398]     Ответить | Цитировать Сообщить модератору
 Re: Можно сделать выборку N случайных чисел одним запросом?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
;WITH cte AS (
	SELECT n = 1, RAND(CHECKSUM(NEWID())) AS r
	UNION ALL
	SELECT n + 1, RAND(CHECKSUM(NEWID()))
	FROM cte
	WHERE n < 1000
)
SELECT *
FROM cte
OPTION(MAXRECURSION 0)
31 июл 15, 15:00    [17960450]     Ответить | Цитировать Сообщить модератору
 Re: Можно сделать выборку N случайных чисел одним запросом?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Если не сильно много нужно генерить, то такой вариант более кошерный

DECLARE @num SMALLINT = 100

SELECT TOP(@num) RAND(CHECKSUM(NEWID()))
FROM [master].dbo.spt_values
31 июл 15, 15:03    [17960480]     Ответить | Цитировать Сообщить модератору
 Re: Можно сделать выборку N случайных чисел одним запросом?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
CTE
(1000 row(s) affected)
Table 'Worktable'. Scan count 2, logical reads 6001, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 16 ms.


вариант чтения из таблицы
(1000 row(s) affected)
Table 'spt_values'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1 ms.
31 июл 15, 15:08    [17960525]     Ответить | Цитировать Сообщить модератору
 Re: Можно сделать выборку N случайных чисел одним запросом?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
AlanDenton,

Ну можно и вообще без I/O обойтись:

DECLARE @num INT = 100;

;WITH
a AS (SELECT 1 AS i UNION ALL SELECT 1),
b AS (SELECT 1 AS i FROM a AS x, a AS y),
c AS (SELECT 1 AS i FROM b AS x, b AS y),
d AS (SELECT 1 AS i FROM c AS x, c AS y),
e AS (SELECT 1 AS i FROM d AS x, d AS y),
f AS (SELECT 1 AS i FROM e AS x, e AS y)
SELECT TOP(@num) RAND(CHECKSUM(NEWID())) 
FROM f

(100 row(s) affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
1 авг 15, 01:58    [17963164]     Ответить | Цитировать Сообщить модератору
 Re: Можно сделать выборку N случайных чисел одним запросом?  [new]
MrVoid
Member

Откуда:
Сообщений: 333
@Mind
Прикольно!
DECLARE @num INT = 100;;WITH...
1 авг 15, 22:26    [17964795]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить