Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как из 1 млн. таблицы выбрать 500 случайных записей? / 18 сообщений из 18, страница 1 из 1
03.12.2009, 05:57
    #36344880
Refuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
Здравствуйте!
Подскажите пожалуйста, как из 1 млн. таблицы выбрать 500 случайных записей?
...
Рейтинг: 0 / 0
03.12.2009, 09:42
    #36345054
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
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
03.12.2009, 10:51
    #36345237
Refuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
Как много кода...
А проще никак? В одном селекте например))
...
Рейтинг: 0 / 0
03.12.2009, 10:52
    #36345242
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
RefuserКак много кода...
А проще никак? В одном селекте например))

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

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

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

Чувствуется, что человек прямо-таки страдает по SELECT-SQL, однако это страдание безответное. Такой SELECT просто выберет первых 500 записей (неслучайных) из таблицы и красиво их упорядочит случайным образом. Вы считаете, что это и есть 500 случайных записей ?
...
Рейтинг: 0 / 0
03.12.2009, 14:22
    #36346054
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
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
03.12.2009, 14:35
    #36346107
Melnik_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
Всех приветствую !
А по моему
Код: plaintext
1.
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R
должно сработать !
Всегда думал , что TOP накладывается после ORDER .
Проверить бы надо , интересно уже , попозже чуток , как обед закончиться . :)
...
Рейтинг: 0 / 0
03.12.2009, 14:43
    #36346134
&lt;&gt;
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
Melnik_AВсех приветствую !
А по моему
Код: plaintext
1.
SELECT TOP  500  Field1, RAND() as R FROM Tab1 ORDER BY R
должно сработать !
Всегда думал , что TOP накладывается после ORDER .
Проверить бы надо , интересно уже , попозже чуток , как обед закончиться . :)

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

*=======================
* курсор для вывода строк
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
03.12.2009, 15:04
    #36346212
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
Да, верно. При изучении 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
03.12.2009, 15:05
    #36346215
igorbik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
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
03.12.2009, 15:05
    #36346217
Melnik_A
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как из 1 млн. таблицы выбрать 500 случайных записей?
2<>
И действительно работает ! :)
Красиво получается .

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

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


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