powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пометить записи с максимальной ценой в таблице
14 сообщений из 14, страница 1 из 1
Пометить записи с максимальной ценой в таблице
    #38232721
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак не могу составить запрос, есть таблица такого вида
IdNomerCenaFl_Max1458100.00.F.245815.00.F.3394290.00.F.445855.00.F.5645100.00.F.678130.00.F.7645200.00.F.8458110.00.F.
необходимо проставить в поле Fl_Max .T. только у тех значений Id, где Cena из одинаковых Nomer максимальна (если несколько одинаковых, можно брать максимальную по Id), т.е. получается это:
IdNomerCenaFl_Max1458100.00.F.245815.00.F.3394290.00.T.445855.00.F.5645100.00.F.678130.00.T.7645200.00.T.8458110.00.T.
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232757
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно обязательно делать через UPDATE-SQL, или можно использовать SCAN?
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232818
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Час промучился с апдейтом, ничего так и не получилось, сейчас попробую сканом, на первый взгляд получается громоздкая конструкция, скан по таблице, при этом внутри выбирать из той же таблицы первую запись отсортированную по
Код: sql
1.
order by Nomer Asc, Cena Desc, Id Asc

и сравнивать id, если совпало, то ставим .T.
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232838
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tor300,

Если сканом, то не надо сравнивать Id... Надо проверять, если сменился номер:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
go top
last_nomer=0
scan
 if nomer<>last.nomer
  replace Fl_Max with .t.
 else
  last_nomer=nomer
 endif
endscan
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232847
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
if nomer<>last_nomer
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232848
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tor300Час промучился с апдейтом, ничего так и не получилось, сейчас попробую сканом, на первый взгляд получается громоздкая конструкция, скан по таблице, при этом внутри выбирать из той же таблицы первую запись отсортированную по
Код: sql
1.
order by Nomer Asc, Cena Desc, Id Asc

и сравнивать id, если совпало, то ставим .T.
так не надо выбирать по одной, надо сравнивать Nomer с предыдущим.
за один скан все делается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ID, Nomer, Cena from MyTable order by Nomer Asc, Cena Desc, Id Asc into cursor tres
lnPrevNom = -1
sele tres
scan
   if lnPrevNom != tres.nom
      lnPrevNom = tres.nom
      update MyTable set Fl_Max = .T. where MyTable.ID = tres.ID
   endif
endscan
use in tres
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38232911
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, можно сделать всё и одним апдейтом:
Код: sql
1.
2.
3.
4.
5.
OLD_ENGINEBEHAVIOR=SET("ENGINEBEHAVIOR")
SET ENGINEBEHAVIOR 70
UPDATE table1 SET Fl_Max = .t. FROM table1 INNER JOIN ;
 (SELECT t2.id, MAX(t2.cena) FROM table1 t2 GROUP BY t2.nomer) t2 ON table1.id=t2.id
SET ENGINEBEHAVIOR &OLD_ENGINEBEHAVIOR

но увлекаться такими особенностями не стОит
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233268
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за варианты, сделал через скан. Таблица на входе не отсортирована, размер не очень большой, на производительность не сильно влияет, поэтому оставил пока так. Не пинать ! :-) Сам знаю что можно построить индекс, и потом в один проход заполнить, но надо было все срочно, одним запросом не получалось, поэтому был выбран данный вариант.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT ErrList
SCAN
	SELECT TOP 1 r.nomer,r.cena,r.id FROM ErrList r ORDER BY r.nomer asc,r.cena desc,r.id asc;
	WHERE r.nomer=ErrList.nomer INTO CURSOR ErrList2
	IF ErrList2.id=ErrList.id
		replace ErrList.fl_max WITH .T.
	endif
ENDSCAN
USE IN ErrList2
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233303
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233373
Reese
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Быстрее будет через скан.
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233440
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tor300Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.Вариант AndreTM (с апдейтом) и вариант Dima T суть одно и то же, вообще-то
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tor300Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.
Замерь. Как мои замеры показывают самый тормоз - скан по таблице с индексом. Никогда бы не подумал пока сам не замерил.
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233552
pioner-v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tor300Никак не могу составить запрос, есть таблица такого вида
...
необходимо проставить в поле Fl_Max .T. только у тех значений Id, где Cena из одинаковых Nomer максимальна (если несколько одинаковых, можно брать максимальную по Id)
...

А если так:
Код: 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.
SET PATH TO c:\tmp
SET DEFAULT TO c:\tmp
IF !file("c:\tmp\exp1.dbf")
 CREATE TABLE Exp1 free codepage=1251 (ID N(5), ;
         Nomer N(4), cena N(7,2), Fl_Max L)
 INSERT INTO exp1 Values(1, 458, 250.00, .F.)
 INSERT INTO exp1 Values(2, 458, 15.00, .F.)
 INSERT INTO exp1 Values(3, 458, 250.00, .F.)
 INSERT INTO exp1 Values(4, 394, 290.00, .F.)
 INSERT INTO exp1 Values(5, 645, 200.00, .F.)
 INSERT INTO exp1 Values(6, 458, 55.00, .F.)
 INSERT INTO exp1 Values(7, 645, 100.00, .F.)
 INSERT INTO exp1 Values(8, 78, 130.00, .F.)
 INSERT INTO exp1 Values(9, 645, 200.00, .F.)
 INSERT INTO exp1 Values(10, 458, 110.00, .F.)
 USE
ENDIF
USE exp1 IN 0

UPDATE exp1 SET fl_Max=.T. ;
From (Select z.nom1, z.cen1, MAX(k.id) as idm ;
      From exp1 k,;
           (Select nomer as nom1, MAX(cena) as cen1;
            From exp1 d ;
            group by nomer) z ;
      Where k.nomer=z.nom1 AND k.cena=z.cen1 ;
      group by z.nom1, z.cen1) r ;
WHERE exp1.id=r.idm and exp1.nomer=r.nom1 AND exp1.cena=r.cen1

BROWSE
CLOSE ALL tables

Контрольный пример изменен, чтобы были повторы
максимального значения у "nomer"
...
Рейтинг: 0 / 0
Пометить записи с максимальной ценой в таблице
    #38233762
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pioner-vUPDATE exp1 SET fl_Max=.T. ;
From (Select z.nom1, z.cen1, MAX(k.id) as idm ;
From exp1 k,;
(Select nomer as nom1, MAX(cena) as cen1;
From exp1 d ;
group by nomer) z ;
Where k.nomer=z.nom1 AND k.cena=z.cen1 ;
group by z.nom1, z.cen1) r ;
WHERE exp1.id=r.idm and exp1.nomer=r.nom1 AND exp1.cena=r.cen1

Типа этого и пытался изначально сделать, всем спасиб.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пометить записи с максимальной ценой в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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