powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из 1 млн. таблицы выбрать 500 случайных записей?
18 сообщений из 18, страница 1 из 1
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36344880
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Подскажите пожалуйста, как из 1 млн. таблицы выбрать 500 случайных записей?
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345054
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RefuserЗдравствуйте!
Подскажите пожалуйста, как из 1 млн. таблицы выбрать 500 случайных записей?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
CLOSE DATABASES
RAND(- 1 )
DIMENSION ArRec[ 500 ], zrec[ 1 ]
STORE  0  TO ArRec
* Заполнение массива случайными номерами записей.
FOR i= 1  TO ALEN(ArRec)
	p=- 1 
	DO WHILE p<= 0  .or. ASCAN(ArRec,p)> 0 
		p=INT( 1000000 *RAND())
	ENDDO
	ArRec[i]=p
NEXT
* Создание пустого курсора для результата выборки.
SELECT * FROM SourceTable WHERE .f. INTO CURSOR Out READWRITE
FOR i= 1  TO ALEN(ArRec)
	GO ArRec[i] IN SourceTable
	SELECT SourceTable
	=ReadRec()  && чтение записи исходной таблицы
	SELECT Out
	APPEND BLANK
	=WriteRec() && запись в результирующий курсор
NEXT
SELECT Out		
BROWSE
CLOSE DATABASES

***********************************
Function ReadRec
***********************************
local obi
obi=fcount()
dimension zrec(obi)
scatter to zrec MEMO 
return

***********************************
Function WriteRec
***********************************
gather from zrec MEMO
return

Проверено на таблице в 220000 записей, VFP9.
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345237
Refuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как много кода...
А проще никак? В одном селекте например))
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345242
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RefuserКак много кода...
А проще никак? В одном селекте например))

А попробуйте, например.
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345377
&lt;&gt;
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типа такого, может:

Код: plaintext
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345799
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если представить массив случайных номеров записей в виде строки типа lcRndRex=1,7,5,2345,...
а потом дать SELECT ... WHERE RecNo IN(lcRndRex)? Выборка такая, правда, будет довольно долго исполняццо...
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36345985
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<>Типа такого, может:

Код: plaintext
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R

Чувствуется, что человек прямо-таки страдает по SELECT-SQL, однако это страдание безответное. Такой SELECT просто выберет первых 500 записей (неслучайных) из таблицы и красиво их упорядочит случайным образом. Вы считаете, что это и есть 500 случайных записей ?
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346054
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOА если представить массив случайных номеров записей в виде строки типа lcRndRex=1,7,5,2345,...
а потом дать SELECT ... WHERE RecNo IN(lcRndRex)? Выборка такая, правда, будет довольно долго исполняццо...

Нет смысла тратить время на формирование такой строки. Можно искать номер записи прямо в массиве :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CLOSE DATABASES
RAND(- 1 )
DIMENSION ArRec[ 500 ]
* Заполнение массива случайными уникальными номерами записей.
FOR i= 1  TO ALEN(ArRec)
	p=- 1 
	DO WHILE p<= 0  .or. ASCAN(ArRec,p)> 0 
		p=INT( 1000000 *RAND())
	ENDDO
	ArRec[i]=p
NEXT
SELECT * FROM SourceTable WHERE ASCAN(ArRec,RECNO())> 0  INTO CURSOR Out
BROWSE
CLOSE DATABASES
Однако, операция небыстрая - выборка из таблицы в 220000 записей идет 1.5 сек.
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346107
Melnik_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всех приветствую !
А по моему
Код: plaintext
1.
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R
должно сработать !
Всегда думал , что TOP накладывается после ORDER .
Проверить бы надо , интересно уже , попозже чуток , как обед закончиться . :)
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346134
&lt;&gt;
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melnik_AВсех приветствую !
А по моему
Код: plaintext
1.
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R
должно сработать !
Всегда думал , что TOP накладывается после ORDER .
Проверить бы надо , интересно уже , попозже чуток , как обед закончиться . :)

А я как раз проверил. И все сработало.
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346208
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и попроще, однако все с тем же алгоритмом

*=======================
* курсор для вывода строк
SELECT * FROM SourceTable WHERE .f. INTO CURSOR Out READWRITE

SELECT sourcetable

FOR i=1 TO 500
GO INT(1000000*RAND())
SCATTER MEMVAR memo
SELECT out
APPEND BLANK
GATHER MEMVAR memo
NEXT
*=======================
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346212
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, верно. При изучении ORDER BY под микроскопом оказалось, что он выполняется раньше, чем TOP.
When you include the TOP clause, you must include an ORDER BY clause. The ORDER BY clause specifies the columns for which the TOP clause determines the number of rows to include in the query result.
Код: plaintext
1.
SELECT TOP  500  SourceTable.*, RAND() as R FROM SourceTable ORDER BY R
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346215
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorbik,

Немножко точнее

*=======================
SELECT * FROM SourceTable WHERE .f. INTO CURSOR Out READWRITE

FOR i=1 TO 500
GO INT(1000000*RAND()) in sourcetable
SCATTER MEMVAR memo
SELECT out
APPEND BLANK
GATHER MEMVAR memo
NEXT
*=======================
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346217
Melnik_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2<>
И действительно работает ! :)
Красиво получается .

Единственно что ,
может лучше написать какнить так -
"SELECT TOP 500 Field1, RAND()*1000000000 as R FROM Tab1 ORDER BY R"
Просто значение RAND() режется до двух знаков после запятой и без увеличения разрядности есть риск получить одинаковые значения полей в выборке .
Хотя он всёравно есть(риск) , но с этим просто так ничего не сделаешь ,
покрайней мере одним селектом точно ! :)
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346230
&lt;&gt;
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melnik_A
Единственно что ,
может лучше написать

Может, и лучше. Я почему и сказал:
Типа такого, может:
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36346233
Melnik_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уфф........
Хотя нет "*1000000000" лишнее ! :)
Запутался я слегка (переел наверное, тяжко :)
Уникальность значения рандом_поля совсем не нужно по задаче .
Это я уже лишнее, от себя придумал .
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36351032
10101000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а Вам не кажется , что Rand()*xxxx при закрытии открытии фокса дает одни и теже цифры...:-))
...
Рейтинг: 0 / 0
Как из 1 млн. таблицы выбрать 500 случайных записей?
    #36351079
SindoMeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10101000а Вам не кажется , что Rand()*xxxx при закрытии открытии фокса дает одни и теже цифры...:-))
Ну так сделать RAND(-1), и всё - будет вам разные циферки
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из 1 млн. таблицы выбрать 500 случайных записей?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]