Псевдослучайный Повторяемый Вид в SQL Server (не NEWID () и не РЭНД ())

Вы можете попробовать следующее для создания запасного метода для всех запросов

@RequestMapping(value = "*", method = RequestMethod.GET)
@ResponseBody
public String getFallback() {
    return "Fallback for GET Requests";
}

Вы можете получить больше информации здесь https://www.baeldung.com/spring-requestmapping

12
задан Peter O. 5 August 2017 в 09:58
поделиться

7 ответов

При создании прочь из предложения хеша gkrogers это работает отлично. Какие-либо мысли о производительности?

declare @seed as int;
set @seed = 10;

create table temp (
id int,
date datetime)

insert into temp (id, date) values (1,'20090119')
insert into temp (id, date) values (2,'20090118')
insert into temp (id, date) values (3,'20090117')
insert into temp (id, date) values (4,'20090116')
insert into temp (id, date) values (5,'20090115')
insert into temp (id, date) values (6,'20090114')

-- re-seeds for every item
select *, HASHBYTES('md5',cast(id+@seed as varchar)) r
from temp order by r
--1 2009-01-19 00:00:00.000 0x6512BD43D9CAA6E02C990B0A82652DCA
--5 2009-01-15 00:00:00.000 0x9BF31C7FF062936A96D3C8BD1F8F2FF3
--4 2009-01-16 00:00:00.000 0xAAB3238922BCC25A6F606EB525FFDC56
--2 2009-01-18 00:00:00.000 0xC20AD4D76FE97759AA27A0C99BFF6710
--3 2009-01-17 00:00:00.000 0xC51CE410C124A10E0DB5E4B97FC2AF39
--6 2009-01-14 00:00:00.000 0xC74D97B01EAE257E44AA9D5BADE97BAF

drop table temp

Править: Отметьте, объявление @seed, поскольку это - использование в запросе, могло быть заменой параметром или постоянным интервалом, если динамический SQL используется. (объявление @int способом TSQL не необходимо),

13
ответ дан 2 December 2019 в 20:41
поделиться

Можно использовать значение от каждой строки для переоценивания функции рэнда:

Select *, Rand(@seed + id) as r from temp order by r

добавление идентификатора гарантирует, что рэнд пересеян для каждой строки. Но для значения семени Вы будете всегда возвращать ту же последовательность строк (при условии, что таблица не изменяется),

1
ответ дан 2 December 2019 в 20:41
поделиться

Создание хеша может быть намного более трудоемким, чем создание отобранного случайного числа.

Для получения большего количества вариации в ourput РЭНДА ([семя]), необходимо сделать [семя], варьируются значительно также. Возможно такой как...

SELECT
    *,
    RAND(id * 9999)    AS [r]
FROM
   temp
ORDER BY
   r

Используя константу гарантирует replicability, который Вы попросили. Но остерегайтесь результата (идентификатор * 9999) порождение переполнения, если Вы ожидаете, что Ваша таблица станет достаточно большой...

1
ответ дан 2 December 2019 в 20:41
поделиться

После выполнения некоторого чтения этого принятый метод.

Select Rand(@seed) -- now rand is seeded

Select *, 0 * id + Rand() as r from temp order by r

Наличие идентификатора в выражении заставляет это быть переоцененным каждая строка. Но умножение его 0 гарантирует, что не не влияет на результат рэнда.

Какой ужасный способ сделать вещи!

0
ответ дан 2 December 2019 в 20:41
поделиться

Это работало хорошо на меня в прошлом, и это может быть применено к любой таблице (просто устройство, повышаяющее характеристики, пункт ORDER BY):

SELECT *
FROM MY_TABLE
ORDER BY  
  (SELECT ABS(CAST(NEWID() AS BINARY(6)) % 1000) + 1);
-1
ответ дан 2 December 2019 в 20:41
поделиться
SELECT *, checksum(id) AS r FROM table ORDER BY r

Этот вид работ. Хотя вывод от контрольной суммы () не смотрит все что случайный мне. Состояния Документации MSDN:

[...], мы не рекомендуем использовать КОНТРОЛЬНУЮ СУММУ, чтобы обнаружить, изменились ли значения, если Ваше приложение не может терпеть иногда пропавших без вести изменения. Рассмотрите использование HashBytes вместо этого. Когда хеш-алгоритм MD5 указан, вероятность HashBytes, возвращая тот же результат для двух различных исходных данных намного ниже, чем та из КОНТРОЛЬНОЙ СУММЫ.

Но может быть это быстрее.

1
ответ дан 2 December 2019 в 20:41
поделиться
create table temp (
id int,
date datetime)

insert into temp (id, date) values (1,'20090119')
insert into temp (id, date) values (2,'20090118')
insert into temp (id, date) values (3,'20090117')
insert into temp (id, date) values (4,'20090116')
insert into temp (id, date) values (5,'20090115')
insert into temp (id, date) values (6,'20090114')

-- re-seeds for every item
select *, NEWID() r
from temp order by r

drop table temp
0
ответ дан 2 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: