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

Откуда: Ивано-Франковск-Киев
Сообщений: 467
Как выбрать одну случайную запись из таблицы?
или
Как выбрать одно случайное значение из одного столбца числового типа?

Выборка будет в цикле. Нужен максимальный разброс.
12 ноя 20, 10:54    [22230619]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Oleg_SQL
Member

Откуда: от туда
Сообщений: 50
Shovgenyuk,

у вас в таблице 1 млрд строк с полем Val
999 999 999 имеют значение 1
1 строка имеет значение 0

Нужно выбрать 2 значения с "максимальным разбросом"
1 и 0 ?
или все же 1 и 1?

Можно в цикле заполнять временную таблицу значениями, которые уже получались.
А выбирать по условию SELECT TOP 1 Val FROM MyTable WHERE Val NOT IN (SELECT Val FROM #T)...
Это если таблица - Куча.

Сообщение было отредактировано: 12 ноя 20, 11:06
12 ноя 20, 11:08    [22230626]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4378
(удалено)

Сообщение было отредактировано: 12 ноя 20, 11:29
12 ноя 20, 11:29    [22230644]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
на таблицу есть хинт называющийся TABLESAMPLE (..)
не совсем рандомный в классическом понимании - но зато довольно шустрый
и не для малых таблиц.
12 ноя 20, 12:04    [22230662]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
komrad
Member

Откуда:
Сообщений: 5345
Shovgenyuk,

https://dba.stackexchange.com/questions/955/what-is-the-best-way-to-get-a-random-ordering
12 ноя 20, 12:05    [22230663]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 467
Oleg_SQL
Shovgenyuk,

у вас в таблице 1 млрд строк с полем Val
999 999 999 имеют значение 1
1 строка имеет значение 0

Нужно выбрать 2 значения с "максимальным разбросом"
1 и 0 ?
или все же 1 и 1?


1 и 1
12 ноя 20, 12:25    [22230672]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 467
komrad
Shovgenyuk,

https://dba.stackexchange.com/questions/955/what-is-the-best-way-to-get-a-random-ordering


ORDER BY NEWID()
затратно и долго будет
12 ноя 20, 12:27    [22230674]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9489
Примерно так
select
 e.[value]
from
 (select min([value]), max([value]) from MyTable) a(min_value, max_value) cross apply
 (select a.min_value + rand(checksum(newid())) * (a.max_value - a.min_value + 1)) b(random_value) cross apply
 (select top (1) [value] from MyTable where [value] <= b.random_value order by [value] desc) c(low_bound) cross apply
 (select top (1) [value] from MyTable where [value] >= b.random_value order by [value]) d(high_bound) cross apply
 (select top (1) [value] from MyTable with (forceseek) where [value] between c.low_bound and d.high_bound order by rand(checksum(newid()))) e([value])

ЗЫ: Нужен индекс по [value]
12 ноя 20, 12:34    [22230676]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
vikkiv
Member

Откуда: London
Сообщений: 2757
тут как-бы ТС сам не определился по пободу довольно разных вещей:
случайное значение (из записей) или всё-таки максимальный разброс
(что может быть ещё с натяжкой интерпретировано как равномерное распределение)

откуда прилетело требование (и попытка решения задачи) по сортировке - остаётся только догадываться
(какой там метод применили для исходной задачи с довольно мутным пока описанием)
12 ноя 20, 12:38    [22230681]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 467
vikkiv
тут как-бы ТС сам не определился по пободу довольно разных вещей:
случайное значение (из записей) или всё-таки максимальный разброс
(что может быть ещё с натяжкой интерпретировано как равномерное распределение)

откуда прилетело требование (и попытка решения задачи) по сортировке - остаётся только догадываться
(какой там метод применили для исходной задачи с довольно мутным пока описанием)


Задача следующая:

Есть таблица Tab1 из полями FieldId, ... FieldFK
FieldId - primary key
FieldFK - foreign key. Содержит ключи из Tab2

Надо хаотично перемешать значения FieldFK во всей таблице Tab1

Сообщение было отредактировано: 12 ноя 20, 12:48
12 ноя 20, 12:51    [22230690]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Кесарь
Member

Откуда:
Сообщений: 463
vikkiv
откуда прилетело требование (и попытка решения задачи) по сортировке - остаётся только догадываться
(какой там метод применили для исходной задачи с довольно мутным пока описанием)


Да и так понятно, что это задание студенту. Такие бессмысленные задачи ставят только преподаватели, ну и ещё особо умные эээ специалисты работодателей на собеседованиях (типа сделай мне за 5 минут то, на что умные люди в прошлом потратили не один день, прежде чем написать свои умные книги, в которых я это прочёл в институте и до сих пор помню).
12 ноя 20, 12:53    [22230691]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Dimbuch®
Member

Откуда: Москва
Сообщений: 108
Shovgenyuk,

Сортировать по GUID

SELECT NEWID() AS guid, a.txt
FROM (
    SELECT 'name1' AS txt
    UNION ALL SELECT 'name2' AS txt
    UNION ALL SELECT 'name3' AS txt
    UNION ALL SELECT 'name4' AS txt
    UNION ALL SELECT 'name5' AS txt
) a
ORDER BY 1
12 ноя 20, 13:38    [22230724]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
Shovgenyuk,

решение состоит в том, чтобы 1) иметь генератор целочисленных значений с заданной плотностью распределения 2) иметь таблицу, записи из которой не удаляют 3) иметь пронумерованный список ключей этой таблицы. Далее по значению генератора выбирать ключ.
12 ноя 20, 19:09    [22231058]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 760
Shovgenyuk

Надо хаотично перемешать значения FieldFK во всей таблице Tab1


По-моему, вы только что описали решение. Выбираете метод перемешивания, и перемешиваете.
Вам предложить метод перемешивания?
12 ноя 20, 20:25    [22231084]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Shovgenyuk
Задача следующая:

Есть таблица Tab1 из полями FieldId, ... FieldFK
FieldId - primary key
FieldFK - foreign key. Содержит ключи из Tab2

Надо хаотично перемешать значения FieldFK во всей таблице Tab1
Если вам нужно обновить сразу всю таблицу, то лучше действительно отсортировать про newid()
В том числе можно подготовить данные в нескольких таблицах, по числу полей, если таблица очень большая.

Например, так (update из select сами сделаете):
--truncate table #t
create table #t(id int, i1 int, i2 int, i3 int)
insert #t (id, i1, i2, i3)
select n, n, n, n
from (select row_number() over(order by id) as n
from sysobjects o ) t


select i.id, i.i1, i.i2, i.i3, i.id_row, i1.i1, i2.i2, i3.i3
from (
	select id, i.i1, i2, i3, row_number() over(order by id) as id_row
	from #t i
) as i
	join (
		select i1, row_number() over(order by newid()) as id_row
		from #t
	) i1 on i1.id_row = i.id_row
	join (
		select i2, row_number() over(order by newid()) as id_row
		from #t
	) i2 on i2.id_row = i.id_row
	join (
		select i3, row_number() over(order by newid()) as id_row
		from #t
	) i3 on i3.id_row = i.id_row
12 ноя 20, 23:35    [22231160]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
Кесарь
vikkiv
откуда прилетело требование (и попытка решения задачи) по сортировке - остаётся только догадываться
(какой там метод применили для исходной задачи с довольно мутным пока описанием)


Да и так понятно, что это задание студенту. Такие бессмысленные задачи ставят только преподаватели, ну и ещё особо умные эээ специалисты работодателей на собеседованиях (типа сделай мне за 5 минут то, на что умные люди в прошлом потратили не один день, прежде чем написать свои умные книги, в которых я это прочёл в институте и до сих пор помню).
может, эту БД разрабам сторонним отдают
одна из частей работы, чтобы хоть как-то обезопасить данные
13 ноя 20, 09:55    [22231252]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Кесарь
Member

Откуда:
Сообщений: 463
andreymx
Кесарь
пропущено...


Да и так понятно, что это задание студенту. Такие бессмысленные задачи ставят только преподаватели, ну и ещё особо умные эээ специалисты работодателей на собеседованиях (типа сделай мне за 5 минут то, на что умные люди в прошлом потратили не один день, прежде чем написать свои умные книги, в которых я это прочёл в институте и до сих пор помню).
может, эту БД разрабам сторонним отдают
одна из частей работы, чтобы хоть как-то обезопасить данные


А как эти специалисты с такой базой работать будут?
13 ноя 20, 13:03    [22231371]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
Shovgenyuk
Member

Откуда: Ивано-Франковск-Киев
Сообщений: 467
Кесарь
andreymx
пропущено...
может, эту БД разрабам сторонним отдают
одна из частей работы, чтобы хоть как-то обезопасить данные


А как эти специалисты с такой базой работать будут?


Если так интересно, то я отвечу.
Рабочая база от клиента превращается в демонстрационную для изготовления видео-инструкций с разными примерами.
Надо деперсонализировать все данные
14 ноя 20, 08:49    [22231913]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Shovgenyuk
Кесарь
пропущено...


А как эти специалисты с такой базой работать будут?


Если так интересно, то я отвечу.
Рабочая база от клиента превращается в демонстрационную для изготовления видео-инструкций с разными примерами.
Надо деперсонализировать все данные
Деперсонализацию делают изменением самих данных, атрибутов, содержащих персональные данные. А у вас же внутренние ссылки, как я понял? Что толку их "перемешивать"?
У нас, например, ссылки не меняют, хотя у нас не только персональные, но и банковские данные, которые в соответствии с законодательством охраняются сильнее.

Впрочем, я не знаю вашей модели данных, может, это для вашей системы и правильно. Может, это ссылки на записи в КЛАДР-е каком нибудь? Тогда всё правильно.

ИМХО тогда лучше использовать мой вариант (и другие тоже писали про такой подход), раз нужно сделать полную загрузку с искажением.
14 ноя 20, 10:16    [22231921]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать оду случайную запись из таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
alexeyvg
Например, так (update из select сами сделаете):
Или даже лучше не update, а insert
И хоть по 100 млрд записей деперсонализируйте.
14 ноя 20, 17:17    [22232097]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить