powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как красиво отобрать первые встретившиеся записи?
11 сообщений из 36, страница 2 из 2
Как красиво отобрать первые встретившиеся записи?
    #37499096
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и одним
но фокс вроде тяжко переваривает трехэтажные запросы
не уверен что сделает селек из селект
плохо работает с рекно()
да и груп бай в опции ин может ругаться этого я точно не помню
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37499304
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут поигрался с данным вопросом, включив в него пару своих функций. Ничего толкового не вышло. Идея была сохранять в массиве номера id обработанных записей. Работает, но криво через SQL-SELECT. Там, видимо, ещё и внутри селекта такая дребедень, которой лучше не касаться. Пришёл к выводу, что это проще делать обычным процедурным способом. Индексирование (по UNIQUE ?), выбор, запись куда-нить. Селект он хорош, однакож "о сколько нам открытий чудных готовит..." :)
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37499658
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sWinTyzможно и одним
но фокс вроде тяжко переваривает трехэтажные запросы
не уверен что сделает селек из селект
плохо работает с рекно()
да и груп бай в опции ин может ругаться этого я точно не помню
Для начал, если Вы создали уникальный идентификатор, то зачем все остальные "пляски с бубном" по объединению с дополнительным полем? Чем Вас не устравает минимальное значение самого уникального идентификатора? Он на то и уникален.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create cursor test (f1 I, f2 C( 10 ))
insert into test values ( 1 , 'one')
insert into test values ( 1 , 'one')
insert into test values ( 2 , 'two')

select *,recno() as nn from test into cursor c1 nofilter

select f1, min(nn) as nn from c1 into cursor curGroup group by f1

select * from c1  where nn in (Select nn from curGroup)

Следующий вопрос. А почему Вы решили что в таблице нет уникального идентификатора? Потому что его не было в исходной постановке? Так вроде автора вопроса мое решение основанное как раз на существовании уникального идентификатора вполне устроило. Т.е. идентификатор все-таки есть.

Наконец, подзапросы в VFP9 делать уже можно. В старых версиях действительно нельзя было. В данном случае, можно пропустить вторую выборку

Код: plaintext
select * from c1  where nn in (select min(nn) as nn from c1 group by f1)

Только опять же, а зачем?
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37500129
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ВладимирМ
да ладно бог с ним ... давно я шашки в руках не держал
еще с гражданской
спасибо за полученное удовольствие

а можно вопрос ?
чем сейчас такой маститый фокспрошник занимается?
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37500138
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати мои последние запросы несколько отличаются от последнего поста Вашего
ну да не важно
желание спорить совсем нет
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37500172
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Чем Вас не устравает минимальное значение самого уникального идентификатора? Он на то и уникален.


ну вот как то не устраивает
даже сам не пойму почему, привычка наверное
ищу именно первую запись по индексу, а потом уже обеспечиваю уникальность
, а не просто беру первую по порядку следования записей в таблице в приделах группировки
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37500225
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Засомневался насчет скорости предложенных вариантов, решил померить.
Исходники тутclear
Код: 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.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
if !file('test.dbf')
	create Table (lcFile) free (nId i autoinc, nNom i, cText c( 10 ))
	for i =  1  to  10000000 
		insert into test (nNom, cText) values (rand() *  9999  +  1 , sys( 2015 ))
	endfor
	index on nId tag nId
	index on nNom tag nNom
	index on bintoc(nNom) + bintoc(nId) tag NomId collate "machine"
	use in test
else
	if used('test')
		use in test
	endif
endif

sele  0 
use test shared
Test1()
Test1()
Test1()
Test2()
Test2()
Test2()
*!*	Test3()
*!*	Test3()
*!*	Test3()
Test4()
Test4()
Test4()

return

func Test1
if used('Res1')
	use in Res1
endif
lnSec = Seconds()
select * ;
from Test ;
where not exists(select  1  from Test tab2 ;
                       where tab2.nNom = Test.nNom;
                          and tab2.nId < Test.nId);
	into cursor Res1
? 'Test1', Seconds() - lnSec
return                      

func Test2
if used('Res2')
	use in Res2
endif
lnSec = Seconds()
create cursor res2 (nId i, nNom i, cText c( 10 ))
index on nNom tag nNom
set order to
sele Test
scan
    if !IndexSeek(Test.nNom, .T., 'res2', 'nNom')
      insert into res2 (nId, nNom, cText) values (Test.nId, Test.nNom, test.cText)
   endif
endscan
? 'Test2', Seconds() - lnSec
return                      

func Test3
if used('Res3')
	use in Res3
endif
lnSec = Seconds()
create cursor res3 (nId i, nNom i, cText c( 10 ))
sele Test
set Order To NOMID   && BINTOC(NNOM)+BINTOC(NID) 
scan
    if Test.nNom != res3.nNom
      insert into res3 (nId, nNom, cText) values (Test.nId, Test.nNom, test.cText)
   endif
endscan
? 'Test3', Seconds() - lnSec
return                      

func Test4
if used('Res4')
	use in Res4
endif
lnSec = Seconds()
*select *,recno() as nn from test into cursor c1 nofilter
select nNom, min(nId) as nn from Test into cursor curGroup group by nNom
select * from c1  where nn in (Select nn from curGroup) into cursor res4
? 'Test4', Seconds() - lnSec
return   

У меня результаты такие:
Test1 (select ... where not exists) - 98 сек среднее (тут большие разбеги по времени 74, 106 и 118, непонятно отчего замедление)
Test2 (SCAN без индекса) - 17,5 сек
Test3 (SCAN c индексом) - 212 сек
Test4 (два селекта) - 15,8 сек

В итого при наличии ID выигрывает вариант предложенный sWinTyz, при отсутствии ID - он дольше (22 сек) чем мой вариант со сканом. Очень удивила скорость скана при включенном индексе, не думал что настолько медленнее будет.
...
Рейтинг: 0 / 0
Как красиво отобрать первые встретившиеся записи?
    #37500327
sWinTyz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опыт не пропьешь ....

замечание :
тут еще важен порядок исполнения методов
если это все происходило в одной процедуре конечно
фокс работает то ли со стеком памяти то ли еще с чем то
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как красиво отобрать первые встретившиеся записи?
    #38180419
USE ..
INDEX ON id TO tst UNIQUE
BROWSE
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как красиво отобрать первые встретившиеся записи?
    #39048915
chyber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположительно, если первый столбец был уникальным ключом recno,
select field1,field2 from table group by field1,field2(?) having recno=min(recno)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как красиво отобрать первые встретившиеся записи?
    #39898773
Лунтик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, дайте еще раз спасибо скажу) еще раз пригодилось ...
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как красиво отобрать первые встретившиеся записи?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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