powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оставить только строки с максимальным значением
17 сообщений из 17, страница 1 из 1
Оставить только строки с максимальным значением
    #39069163
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Задача: оставить только строки с максимальным значением bvtyp. Работает и ра ботает, может быть зациклилось?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select max(bvtyp) as maxbvtyp, lifnr, zwaers ;
     from lfbkmax      group by lifnr, zwaers       into cursor result 

scan all
  select lfbkmax    
  delete for lifnr = result.lifnr and zwaers = result.zwaers and bvtyp  <> result. maxbvtyp
  select result  
endscan

select lfbkmax   
   pack
quit
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069175
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrfможет быть зациклилось?нахрен вам эти циклы?

Код: sql
1.
2.
3.
4.
5.
6.
7.
Delete q1 from lfbkmax q1 left join (;
 select max(bvtyp) as maxbvtyp, lifnr, zwaers;
 from lfbkmax group by lifnr, zwaers;
) q2 on q1.lifnr=q2.lifnr and q1.zwaers=q2.zwaers;
where q2.maxbvtyp<>q1.bvtyp

pack in lfbkmax
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069374
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir, спасибо. В моем фокспро delete С join нельзя использовать, только с for и while.
pack in lfbkmax тоже нельзя.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069375
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как оставить только строки, если таких максимальных значений bvtyp больше одного в разрезе lifnr и zwaers?
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069388
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrfмаксимальных значений bvtyp больше одногоэто как? О_о
ghjdjlrfВ моем фокспро delete С join нельзя использовать, только с for и while.
pack in lfbkmax тоже нельзя.тады ой
ну вкрутите в цикл отображение количества обработанных записей да смотрите, что происходит
скорее всего нет индекса на lifnr+zwaers, потому каждый delete шерстит всю таблицу
O(N^2) - это не шутки
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069433
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir, Кол-во записей вывелось в самом начале, затем тольк записи "0(в основном 0) record deleted"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
 select max(bvtyp) as maxbvtyp, count(*) as cnt, lifnr, zwaers, bvtyp ;
  from lfbkmax group by lifnr, zwaers into cursor result

 scan all &&for cnt > 1
  select lfbkmax
   delete for lifnr = result.lifnr ;
        and zwaers = result.zwaers ;
        and bvtyp  <> result.maxbvtyp
   select result
   set odometer to 1000
 endscan

 select count(*) as cnt2, lifnr, zwaers ;
  from result group by lifnr, zwaers, bvtyp into cursor res2

 scan for cnt2 = 1
  select lfbkmax
   delete for lifnr = res2.lifnr and zwaers = res2.zwaers
   select res2
   set odometer to 1000
 endscan

 select lfbkmax  
 pack         
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069435
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
максимальных значений bvtyp больше одного

Т.е. поле bvtyp имело значения, например, 1,2,3,4,4.

Надо оставить только две строки с "4".
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069468
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrfЗадача: оставить только строки с максимальным значением bvtyp. Работает и ра ботает, может быть зациклилось?
...
Код верный. Просто медленно работает.
посмотри что выдаст
Код: sql
1.
? reccount('result')*reccount('lfbkmax')


Это сколько записей будет обработано в итоге.

Напиши какой тип у полей lifnr, zwaers. Покажу как ускорить индексом.
И версию фокса напиши.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069476
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrf
Код: sql
1.
2.
 select max(bvtyp) as maxbvtyp, count(*) as cnt, lifnr, zwaers, bvtyp ;
  from lfbkmax group by lifnr, zwaers into cursor result


Зря в этом запросе bvtyp добавил. Выберется какой-то случайный.


ghjdjlrf
Код: sql
1.
2.
 select count(*) as cnt2, lifnr, zwaers ;
  from result group by lifnr, zwaers, bvtyp into cursor res2


Тут всегда будут те же lifnr, zwaers что в result и все cnt2 всегда 1.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069486
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, спасибо.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
creat dbf lfbk (lifnr c (10) ;
 , banks c (3) ;
 , bankl c (30) ;
 , bankn c (30) ;
 , bkont c (2) ;
 , bvtyp c (3) ;
 , zwaers c (3))
 append from lfbkREZ.txt deli with tab 



Жду уже 35 минут выполнения.
код у меня очень длинный, как короче написать, не знаю.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069488
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия у фокспро не указана.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069501
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, почему всегда 1 запись? Может быть несколько с наибольшим значением bvtyp.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069516
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrf
Код: sql
1.
2.
3.
creat dbf lfbk (lifnr c (10) ;
...
 , bvtyp c (3) ;


код у меня очень длинный, как короче написать, не знаю.
Весь код не надо, этого пока достаточно.
Косяк: bvtyp у тебя символьный, max(bvtyp) даст неверное значение, т.к. "2" > "11" надо сделать bvtyp n(3)
ghjdjlrfВерсия у фокспро не указана.
Выполни и напиши что выдаст
Код: sql
1.
? version()


ghjdjlrfDima T, почему всегда 1 запись? Может быть несколько с наибольшим значением bvtyp.
потому что в result нет повторов lifnr, zwaers
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069522
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в любой версии будет работать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select max(bvtyp) as maxbvtyp, lifnr, zwaers;
     from lfbkmax      group by lifnr, zwaers       into cursor result 
index on lifnr+zwaers tag lz

select lfbkmax    
scan 
  sele result 
  seek lfbkmax.lifnr + lfbkmax.zwaers
  if found() and lfbkmax.bvtyp <> result.maxbvtyp
     sele lfbkmax
     delete
  endif
endscan
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069526
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, спасибо.
версия 2.6a (X)
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069532
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ghjdjlrfDima T, спасибо.
версия 2.6a (X)
Будешь топики новые поднимать - обязательно указывай что 2.6, т.к. она очень древняя, там много чего нет по сравнению с 9-й.
...
Рейтинг: 0 / 0
Оставить только строки с максимальным значением
    #39069546
ghjdjlrf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, спасибо. Отработало враз. Теперь попробую оставить только максимальные bvtyp, которые встречаются более 1 раза (должна остаться 1 строка).
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оставить только строки с максимальным значением
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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