Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пометить записи с максимальной ценой в таблице / 14 сообщений из 14, страница 1 из 1
19.04.2013, 14:22
    #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
19.04.2013, 14:39
    #38232757
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
Нужно обязательно делать через UPDATE-SQL, или можно использовать SCAN?
...
Рейтинг: 0 / 0
19.04.2013, 15:03
    #38232818
tor300
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
Час промучился с апдейтом, ничего так и не получилось, сейчас попробую сканом, на первый взгляд получается громоздкая конструкция, скан по таблице, при этом внутри выбирать из той же таблицы первую запись отсортированную по
Код: sql
1.
order by Nomer Asc, Cena Desc, Id Asc

и сравнивать id, если совпало, то ставим .T.
...
Рейтинг: 0 / 0
19.04.2013, 15:08
    #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
19.04.2013, 15:12
    #38232847
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
Код: sql
1.
if nomer<>last_nomer
...
Рейтинг: 0 / 0
19.04.2013, 15:12
    #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
19.04.2013, 15:35
    #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
19.04.2013, 17:44
    #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
19.04.2013, 17:58
    #38233303
tor300
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.
...
Рейтинг: 0 / 0
19.04.2013, 18:37
    #38233373
Reese
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
Быстрее будет через скан.
...
Рейтинг: 0 / 0
19.04.2013, 19:17
    #38233440
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
tor300Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.Вариант AndreTM (с апдейтом) и вариант Dima T суть одно и то же, вообще-то
...
Рейтинг: 0 / 0
19.04.2013, 19:52
    #38233462
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пометить записи с максимальной ценой в таблице
tor300Хотя можно и поэкспериментировать, что будет быстрее, создать индекс по таблице и использовать вариант AndreTM , или использовать вариант Dima T с дополнительным курсором и апдейтами.
Замерь. Как мои замеры показывают самый тормоз - скан по таблице с индексом. Никогда бы не подумал пока сам не замерил.
...
Рейтинг: 0 / 0
19.04.2013, 22:34
    #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
20.04.2013, 13:00
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Пометить записи с максимальной ценой в таблице / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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