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

Откуда:
Сообщений: 39
Уважаемые гуру подскажите, как селектом выбрать несколько значений а потом уже из селекта(допустим 10 значений) выбрать рандомное из них? Заранее извиняюсь за нубизм.
18 ноя 16, 17:19    [19909136]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
HarDlacK,
в тысячный раз...
TOP + ORDER BY NEWID()
18 ноя 16, 17:23    [19909147]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4542
TaPaK, мелкомягкие предлагают немного более тру
order by cast(checksum(newid(), [some_field]) & 0x7fffffff as float) / cast (0x7fffffff as int) 
18 ноя 16, 17:40    [19909189]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
Спасибо что обратили внимание на тему. Но я видимо не совсем точно сформулировал вопрос... селект топ и потом ордер бай не совсем то что надо.
Вот запрос какой он есть на данный момент:

SELECT TOP 1
	@abonent_id = (SELECT TOP 1 [_SimpleKey] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6)),
	@nomer = [_Fld272],
	@klient = (SELECT TOP 1 [_Fld1820RRef] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6)),
	@zadacha = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc)		
FROM [upk].dbo._Reference16_VT270
WHERE
	[_Reference16_IDRRef] =	(SELECT TOP 1 [_Fld1820RRef] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6))
	AND	LEN([_Fld272]) = 10
	AND LEFT([_Fld272], 1) = '0'	
ORDER BY 
	[_Fld272] desc


проблема в том что он не всегда хорошо срабатывает, и хотелось бы получать на выходе этого селекта таблицу значений допустим из 10 строк, а из них уже выберать рандомно данные из 1-10 строки и уже их совать в переменные...
18 ноя 16, 17:49    [19909228]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
buser,

да можете хоть в квадрат возводить или по серверу стучать
18 ноя 16, 17:49    [19909230]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
автор
проблема в том что он не всегда хорошо срабатывает, и хотелось бы получать на выходе этого селекта таблицу значений допустим из 10 строк, а из них уже выберать рандомно данные из 1-10 строки и уже их совать в переменные...

TOP + ORDER BY NEWID()
18 ноя 16, 17:51    [19909244]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
КАК получить таблицу значений из 10 строк?
18 ноя 16, 17:59    [19909271]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
o-o
Guest
buser
TaPaK, мелкомягкие предлагают немного более тру
order by cast(checksum(newid(), [some_field]) & 0x7fffffff as float) / cast (0x7fffffff as int) 

ниче не путаете?
типчик предлагает 2 разных решения для 2yx разных задач:

1) Selecting approximate percentage sample of random rows
/*To select an approximate percentage sample of random rows from a table you can you a below query. 
The query will select around 10 % of records from a table.*/

SELECT
    *
FROM Sales.SalesOrderDetail
WHERE 0.1 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
    / CAST (0x7fffffff AS int)

/*Each execution of the above query returns a different count of records, 
which will be close to the 10 percent of total records in the table.*/

2) Selecting exact number of random rows
/*Selecting exact number of random rows is very easy, 
as it is only necessary to sort the query by the NEWID() result and limit the number of returned rows. 
For returning 100 random rows it’s possible to use below query:*/
SELECT TOP 100
    *
FROM Sales.SalesOrderDetail
ORDER BY NEWID()

вот второе как раз и попросил ТС, и ему его и дали
Selecting random records from a table

в ORDER BY никто не засовывал то самое, с полем внутри.
оно в WHERE,
ибо для фильтрования надо какое-то поле, а вот для сортировки "абы как" как раз не надо
18 ноя 16, 18:00    [19909278]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
o-o
Guest
HarDlacK
КАК получить таблицу значений из 10 строк?

ну так top 10
18 ноя 16, 18:04    [19909294]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
топ 10 выдает мне одного и тогоже клиента столько раз сколько есть значение
[_Fld272] (номер телефона)
18 ноя 16, 18:08    [19909308]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
а мне нужно получить 10 клиентов и потом из них выбрать рандомно 1го
18 ноя 16, 18:09    [19909310]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
Пришел к такому запросу
declare @t table(abonent_id char(50), nomer char(50), klient char(50), zadacha char(50))
insert into @t
select TOP 10
	abonent_id = (SELECT TOP 1 [_SimpleKey] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6)),
	nomer = [_Fld272],
	klient = (SELECT TOP 1 [_Fld1820RRef] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6)),
	zadacha = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc)		
FROM [upk].dbo._Reference16_VT270
WHERE
	[_Reference16_IDRRef] =	(SELECT TOP 1 [_Fld1820RRef] FROM [upk].dbo.[_InfoRg1818] WHERE [_Fld1819RRef] = (SELECT TOP 1 [_IDRRef] FROM [upk].dbo.[_Document1808] WHERE [_Fld1815]=1 AND [_Fld1817]=0	AND [_Fld1837]=0 ORDER BY [_Fld1816] desc) AND [_Fld1821RRef] = (SELECT [_IDRRef] FROM [upk].[dbo].[_Enum1809] WHERE [_EnumOrder]=6))
	AND	LEN([_Fld272]) = 10
	AND LEFT([_Fld272], 1) = '0'	

select * from @t


выдает уже в табличном виде, но все ровно одного клиента, как мне прогнать цыклом запрос раз десять чтоб заполнить таблицу значениями?
18 ноя 16, 18:24    [19909366]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4542
o-o, ага... похоже туплю - спасибо... по диагонали когда-то глядел. new_id заглаза... с другой стороны - можно вообще без него
18 ноя 16, 18:40    [19909440]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
o-o
Guest
HarDlacK
а мне нужно получить 10 клиентов и потом из них выбрать рандомно 1го

Ну значит делайте select distinct из клиентов, отбирайте из них с order by newid.
Потом уже в своем запросе фильтруйте по выбранному клиенту
18 ноя 16, 19:20    [19909596]     Ответить | Цитировать Сообщить модератору
 Re: Рандомный селект из селекта  [new]
HarDlacK
Member

Откуда:
Сообщений: 39
Подскажите как выполнить запрос несколько раз и каждый раз после выполнения результат записать в строку временной таблицы?
21 ноя 16, 14:20    [19916184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить