Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск множества минимумов / 13 сообщений из 13, страница 1 из 1
24.05.2010, 11:16
    #36644773
_Margo_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Добрый день!

Подскажите пожалуйста, как найти минимальные (во множественном числе) значения для поля. Если использовать агрегатную функцию min - найдется только одно значение, а мне нужны все.
вот пример таблички
cenkodorgp1p2p320051455077200527746811003165749830054777477150326546811053398503310034746310

результатом должно быть:
cenkodorgp1p2p320051455077200527746811003165749810034746310

Т.е. по значению поля kod должны находится минимальные значения cen и выводиться эти строки.
На нижеследующую конструкцию fox ругается. И все равно подзапрос выводит только 1 минимальное значение, а не все.
Код: plaintext
1.
2.
3.
4.
select cen,kod,org,p1,p2,p3 from predl_tmp1 ;
inner join ;
(select kod,MIN(cen) as cen FROM predl_tmp1 GROUP BY kod) t0 ; 
on predl_tmp1.kod=t0.kod and predl_tmp1.cen=t0.cen ;
into cursor rez

Помогите, пожалуста!
...
Рейтинг: 0 / 0
24.05.2010, 11:52
    #36644860
Погодин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
select * from table where pole=(select min(pole) from table) - ?
...
Рейтинг: 0 / 0
24.05.2010, 12:03
    #36644891
_Margo_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Погодин,

Я подчеркивала - нужно МНОЖЕСТВО минимумов, а агрегатная функция возвращает один минимум. Так что моя проблема должна решаться как-то по-другому...
...
Рейтинг: 0 / 0
24.05.2010, 12:20
    #36644934
З.Ы.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Код: plaintext
select min(поле), набор_полей_группировки from таблица group by набор_полей_группировки
?
...
Рейтинг: 0 / 0
24.05.2010, 12:26
    #36644953
_Margo_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
З.Ы.,

Такое я и сама могу написать. Если бы все было так просто, я бы не обращалась за помощью.
Я написала вариант своего запроса. Но! там ошибка - это раз. И ищу я только один минимум, а нужно искать как-то все одинаковые минимумы по полю kod.
Так что я все еще ищу помощи!
...
Рейтинг: 0 / 0
24.05.2010, 12:28
    #36644959
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Проще всего пройтись SCAN`ом: сравнивать текущее значение с предыдущим и выводить предыдущее, если текущее выросло.
Без учета кода примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create cursor test (cen i)
insert into test values ( 100 )
insert into test values ( 150 )
insert into test values ( 130 )
insert into test values ( 140 )
insert into test values ( 100 )

sele test
go top
lnCenPrev = test.Cen
scan
	if lnCenPrev < test.Cen
		? lnCenPrev
	endif
	lnCenPrev = test.Cen
endscan

чтобы учесть коды - надо либо отсортировать по коду, либо делать SCAN отдельно для каждого кода.
...
Рейтинг: 0 / 0
24.05.2010, 12:41
    #36645004
For Peace
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
А если просто убрать максимальное значения? Останутся минимальные.
...
Рейтинг: 0 / 0
24.05.2010, 12:50
    #36645032
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
_Margo_
На нижеследующую конструкцию fox ругается.
Код: plaintext
1.
2.
3.
4.
select cen,kod,org,p1,p2,p3 from predl_tmp1 ;
inner join ;
(select kod,MIN(cen) as cen FROM predl_tmp1 GROUP BY kod) t0 ; 
on predl_tmp1.kod=t0.kod and predl_tmp1.cen=t0.cen ;
into cursor rez

А как именно ругается?
...
Рейтинг: 0 / 0
24.05.2010, 12:54
    #36645044
Поиск множества минимумов
_Margo_,
если нарисуете код создания и наполнения таблиц для Вашего примера, то попробую показать как делаются кореллированные подзапросы для выполнения таких вот задач.
...
Рейтинг: 0 / 0
24.05.2010, 13:02
    #36645064
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
_Margo_,

Попробуйте один из вариантов (фокса под рукой нет, могу ошибаться)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * from predl_tmp1 pt
where cen in (select min(cen) from predl_tmp1 where kod = pt.kod)
----------------------------------------------------------------
select predl_tmp1.cen, predl_tmp1.kod, org, p1, p2, p3 from predl_tmp1 
inner join 
(select kod,MIN(cen) as cen FROM predl_tmp1 GROUP BY kod) t0  
on predl_tmp1.kod=t0.kod and predl_tmp1.cen=t0.cen 
----------------------------------------------------------------
select predl_tmp1.cen, predl_tmp1.kod, org, p1, p2, p3 from predl_tmp1 
where (kod, cen) in (select kod, MIN(cen) as cen FROM predl_tmp1 GROUP BY kod)  
...
Рейтинг: 0 / 0
24.05.2010, 13:16
    #36645108
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
_Margo_З.Ы.,

Такое я и сама могу написать. Если бы все было так просто, я бы не обращалась за помощью.
Я написала вариант своего запроса. Но! там ошибка - это раз. И ищу я только один минимум, а нужно искать как-то все одинаковые минимумы по полю kod.
Так что я все еще ищу помощи!
Уточните условие.
Минимум поля cen в пределах одинаковых kod ?
А если есть повторы cen в пределах одинакового kod, то берем и их?
Если это верно, то можно, например, так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
USE IN SELECT('temp')
CREATE CURSOR temp (cen INT, Kod INT, org INT, p1 INT, p2 INT, p3 INT)
INSERT INTO temp VALUES ( 200 ,  5 ,  1 ,  45 ,  50 ,  77  )
INSERT INTO temp VALUES ( 200 ,  5 ,  2 ,  77 ,  46 ,  81  )
INSERT INTO temp VALUES ( 100 ,  3 ,  1 ,  65 ,  74 ,  98  )
INSERT INTO temp VALUES ( 300 ,  5 ,  4 ,  77 ,  74 ,  77  )
INSERT INTO temp VALUES ( 150 ,  3 ,  2 ,  65 ,  46 ,  81  )
INSERT INTO temp VALUES ( 105 ,  3 ,  3 ,  98 ,  50 ,  33  )
INSERT INTO temp VALUES ( 100 ,  3 ,  4 ,  74 ,  63 ,  10  )

SELECT t1.* FROM temp t1 ;
WHERE cen = (SELECT MIN(t2.cen) FROM temp t2 WHERE t2.Kod = t1.Kod) ;
ORDER BY t1.kod
С уважением, Алексей
...
Рейтинг: 0 / 0
24.05.2010, 15:03
    #36645372
_Margo_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Спасибо всем, кто откликнулся на мою проблему!
Но я нашла решение.
вот так будет правильно (будет возвращаться значения те что я указала в результирующей таблице):

Код: plaintext
1.
2.
3.
select predl_tmp1.kod, predl_tmp1.cen, predl_tmp1.org,predl_tmp1.p1,predl_tmp1.p2,predl_tmp1.p3  ;
from predl_tmp1, (select kod, MIN(cen) as cen FROM predl_tmp1 GROUP BY kod) t0 ; 
where predl_tmp1.kod=t0.kod and predl_tmp1.cen=t0.cen ;
into cursor rez
...
Рейтинг: 0 / 0
24.05.2010, 15:22
    #36645439
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск множества минимумов
Код: plaintext
1.
2.
3.
4.
5.
select * ;
from predl_tmp1 ;
where not exists(select 'x' from predl_tmp1 t2 ;
		where t2.kod = predl_tmp1.kod ;
		and t2.cena > predl_tmp1.cena)

Следует иметь в виду, что сравнение полей типа Real (цена) прямым сравнением - сомнительное занятие из-за погрешности округления. Для подобных "приблизительных" величин необходимо всегда искать вхождение в некий диапазон значений, а не сравнивать с абсолютным значением.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск множества минимумов / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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