Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка записей, MS SQL Server 
:(
    Опции темы
Vit
Дата 10.10.2002, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



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


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
U-gene
Дата 10.10.2002, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2002

Репутация: нет
Всего: нет



Есть такая функция  RAND
Может быть написать так ?
SELECT ... ORDER BY RAND(... /* от времени, как описано ниже  а также от от ключевого поля\полей, дабы смягчить эффект описанного ниже*/)

Немножко из описания
Цитата

Using RAND
The RAND function calculates a random floating point number between 0 and 1, and can optionally take a tinyint, int, or smallint value for the starting point of the random number to calculate.

A common way to generate random numbers from RAND is to include something relatively variable as the seed value, such as adding several parts of a GETDATE:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )

          + (DATEPART(ss, GETDATE()) * 1000 )

          + DATEPART(ms, GETDATE()) )

 

When you use an algorithm based on GETDATE to generate seed values, RAND can still generate duplicate values if the calls to RAND are made within the interval of the smallest datepart used in the algorithm. This is especially likely if the calls to RAND are included in a single batch. Multiple calls to RAND in a single batch can be executed within the same millisecond, which is the smallest increment of DATEPART. In this case, incorporate a value based on something other than time to generate the seed values.


PM MAIL   Вверх
Vit
Дата 10.10.2002, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Уже пробовал:

SELECT Rand(), * From table
ORDER BY Rand()


Rand вызывается только 1 раз, и в полученных данных первый столбец заполнен одинаковыми числами...




--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Baa
Дата 10.10.2002, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Не пойму? Rand генерирует одинаковые числа чтоли при рекверинге чтоли? Если так, то почему бы не делать перед этим Rand(-1)?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
U-gene
Дата 10.10.2002, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2002

Репутация: нет
Всего: нет



Может проблема в том, что ты пишешеь просто RAND() - без аргументов? Я же говорю о том, что в аргумент этой функции должны входит поле или комбинацию полей записи. В этом случае он должен вызываться заново для каждой строки. А время  должно входить для того, что бы значения , возвращаемые этой функцией отличались для каждой записи от запуска к запуску.

Еще можно попытаься реализовать какую-нить формулу генерации псевдослучайных чисел вручную. Это в сети поискать надо.
PM MAIL   Вверх
Vit
Дата 10.10.2002, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Цитата(U @ 10.10.2002, 01:11)
Я же говорю о том, что в аргумент этой функции должны входит поле или комбинацию полей записи. В этом случае он должен вызываться заново для каждой строки.

Пробовал - те же яйца, вид сбоку. Может напишешь пример, возможно я делаю что-то не так, но похоже даже с аргументом полем генерируется одно и то же число для всех записей.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Sun
Дата 11.10.2002, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: нет
Всего: 48



А разве не нужно возбуждать генератор случайных функций при помощи функции RANDOMIZE()? Я не ручаюсь за TSQL, но в классических языках программирования перед вызовом функций типа RANDOM(), следует возбудить генератор функией типа RANDOMIZE()


--------------------
Account removed
PM MAIL   Вверх
Vit
Дата 11.10.2002, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Дело не в Randomize, а в том что встреченную функцию Rand, SQL server обрабатывает лишь единажды, а далее использует её результат, попытки употреблять ее по разному в разных местах пока к нужному результату не привели. Похоже что любые конструкции c Rand выполняются следующим образом - однократно вычисляется Rand, далее вместо всех поставленных Rand вставляется вычесленное значение... Идея вызывать Rand с аргументом в виде значения поля хорошая, но реализовать мне ее не удалось :(


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
U-gene
Дата 11.10.2002, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.8.2002

Репутация: нет
Всего: нет



Как говорит наш глав.бух. - "через Ж... нараспев" :)

Я посмотрел это ранд. Как-то он хитрО работает. Нельзя сказать, что он генерит для разных строк АБСОЛЮТНО одинаковые числа, но разниза начинается где-то с 5-6 знака после запятой. Причем такая... хорошая разница. В общем, если упорядочивать начиная именно с этого пятого-шестого знака, то получается каждый раз в новом порядке. Вот пример - правда непричесывая и наобум, но работает.

Код

SELECT
(RAND((DATEPART(ms, GETDATE()) * 100000 + (DATEPART(ss, GETDATE()) * 1000)
   + DATEPART(mm, GETDATE()))) + RAND(OutID)) * 100000
 - CONVERT(INTEGER, (RAND((DATEPART(ms, GETDATE()) * 100000 + (DATEPART(ss, GETDATE()) * 1000)
   + DATEPART(mm, GETDATE()))) + RAND(OutID)) * 100000
) AS RRR,
OutID
FROM Out
ORDER BY RRR


OutID - это ключевое целочисленное поле. Можно конечно перевести в строку и отбросить первые 6-7 знаков.

В целом очень плохо, просто ужасно. Это же для каждой таблицы надо что-то подбирать. А если ключевое поле - строка? Ее же придется тоже каким то хитрым способом в аргумены RAND втыкать. Неправильно это :(
PM MAIL   Вверх
Vit
Дата 11.10.2002, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 5
Всего: 207



Спасибо,  U-Gene! Это работает. Не могу сказать чтобы я был в восторге от такой квери, но как минимум это работает.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
math_beginer
Дата 19.4.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 29.5.2003

Репутация: нет
Всего: 1



Понимаю, что немного поздно smile, но вдруг кому-то пригодится

Код

SELECT outId FROM (    
SELECT  top 100000000 outId, NEWID() [id] FROM Out 
    ORDER BY [id]
)as x


как и прежде
Цитата
OutID - это ключевое целочисленное поле.


--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0512 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.