powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос на два максимума
16 сообщений из 16, страница 1 из 1
Запрос на два максимума
    #36585981
_Margo_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажтите, пожалуйста как сформировать запрос.
в таблице есть код товара (может повторятся), дата поступления (может повторятся), цена (может повторятся) и еще несколько характеристик товара.
нужно для КАЖДОГО кода найти строку:
с максимальной датой (их может быть несколько), и из этих нескольких строк отобрать ту у которой цена максимальна. И нужно получить строку с этими данными + характиристики товара, которые соответствуют данной строке.
Заранее благодарна.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586009
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
слабо нарисовать табличку источник и табличку результат?
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586079
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимослабо нарисовать табличку источник и табличку результат?"Прокачай телепатию, салага" (с) ithappens
Код: plaintext
1.
2.
3.
4.
select tbl.kod,tbl.data,max(tbl.cena) cena from tbl 
inner join
(select kod,max(data) data from tbl group by kod) t0 
on tbl.kod=t0.kod and tbl.data=t0.data
group by tbl.kod,tbl.data
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586087
_Margo_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо,

пожалуйста:
исх табл.
kod date cena kod_post kod_kart
1 10.10.2009 100 3 10
2 12.10.2010 800 1 2
3 20.01.2010 300 3 4
1 12.10.2010 90 10 20
1 05.12.2009 200 2 2
3 21.01.2010 50 1 20
2 01.01.2009 10 10 30
2 12.10.2010 800 3 20
4 18.01.2009 200 5 10
1 12.10.2010 80 4 8

ожидаемый результат:
kod date cena kod_post kod_kart
1 12.10.2010 90 10 20
2 12.10.2010 800 3 20
3 21.01.2010 50 1 20
4 18.01.2009 200 5 10
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586103
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Margo_прошелмимо,

пожалуйста:
исх табл.
kod date cena kod_post kod_kart
1 10.10.2009 100 3 10
2 12.10.2010 800 1 2
3 20.01.2010 300 3 4
1 12.10.2010 90 10 20
1 05.12.2009 200 2 2
3 21.01.2010 50 1 20
2 01.01.2009 10 10 30
2 12.10.2010 800 3 20
4 18.01.2009 200 5 10
1 12.10.2010 80 4 8

ожидаемый результат:
kod date cena kod_post kod_kart
1 12.10.2010 90 10 20
2 12.10.2010 800 3 20
3 21.01.2010 50 1 20
4 18.01.2009 200 5 10

чтобы было понятнее телепатам
есть спец.тэги, которыми нужно пользоваться

исх табл.


koddatecenakod_postkod_kart110.10.2009100310

ок, телепаты пусть дальше покачают мозг
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586135
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Margo_ожидаемый результат:
kod date cena kod_post kod_kart
1 12.10.2010 90 10 20
2 12.10.2010 800 3 20
3 21.01.2010 50 1 20
4 18.01.2009 200 5 10
Здесь, похоже, первая строка не имеет место быть по условиям задачи.

Код запроса может быть таким:

select kod, dmax, mprice, kod_post. kod_kart ;
FROM ;
(select kod, max(date) dmax, MAX(cena) as mprice, kod_post. kod_kart ;
from table1 ;
group by 1) t1 ;
GROUP BY 3

В полученном запросе последняя строка - та, что надо.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586224
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorbikЗдесь, похоже, первая строка не имеет место быть по условиям задачиА по-моему, всё верно.
igorbikselect kod, dmax, mprice, kod_post. kod_kart ;
FROM ;
(select kod, max(date) dmax, MAX(cena) as mprice, kod_post. kod_kart ;
from table1 ;
group by 1) t1 ;
GROUP BY 3Позвольте не согласиться. На таких данных
koddatecena12000-01-01150012001-01-0110012001-01-01200Ваш запрос вернёт
12001-01-011500По-моему, это совсем не то, что нужно ТС. Как я понял, должно получиться
12001-01-01200
ЗЫ. Кстати, ваш запрос вообще не гарантирует одинаковых результатов при повторных запусках, да и работать будет только под MySQL. Такой групбай (тот, что снаружи у вас) - русская рулетка.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586226
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хех, да и внутренний групбай из той же оперы.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586249
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Margo_нужно для КАЖДОГО кода найти строку:
с максимальной датой (их может быть несколько), и из этих нескольких строк отобрать ту у которой цена максимальна.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586261
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirХех, да и внутренний групбай из той же оперы.
Мне так долго пришлось пахать на 5-6-версиях Фокса, что привычка сокращать GROUP BY въелась настолько, что мне проще прописать SET ENGINE 70, чем следить за синтаксисом 9-ки.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586282
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igorbik_Margo_нужно для КАЖДОГО кода найти строку:
с максимальной датой (их может быть несколько), и из этих нескольких строк отобрать ту у которой цена максимальна.Вот именно. А ваш запрос выберет код, максимальную дату по коду(из всех строк с таким кодом) и максимальную цену по коду(из всех строк с таким кодом). И где гарантия, что макс. дата и макс. код будут в одной и той же строке? Нетути её, я даже пример выложил в 8652855. Поэтому либо мой вариант, либо предлагайте свой, но рабочий :)
PS. про set engine 70 - да, забыл, но это отнюдь не отменяет вышесказанного.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586358
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,
Ну вот, не разобрался до конца в условии задачи.
Так что код из 8652385 работает корректно.
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586817
_Margo_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, кто отозвался на мой вопрос!
Только вот куда теперь вставить tbl.t1,tbl.t2 (нужно вывести не только код, дату и цену, но и дополнительные характеристики, находящиеся в найденной строке).

Если вставлять их в первый или второй select - нужно будет их включать и в group by, что сразу же испортит картину.

tanglir , твой код работает отлично, но вот куда вписать теперь эти дополнительные характеристики?
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36586927
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Margo_,
идея та же, что и раньше ;)

select tbl.всё_что_надо from tbl inner join (мой_запрос) t1 on tbl.kod=t1.kod and tbl.data=t1.data and tbl.cena=t1.cena
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36587179
_Margo_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
Огромное-огромное спасибо!
В общем оборачивать select в select как в обертку :)
...
Рейтинг: 0 / 0
Запрос на два максимума
    #36587919
LUCIAN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Margo_,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE CURSOR TOVARY (KOD I( 4 ),DATA D( 8 ),CENA N( 10 , 2 ),OPIS C( 250 ))
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 1  ,CTOD('10/10/2009'),  100 ,' 3 10')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 2  ,CTOD('12.10.2010'),  800 ,' 1 2')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 3  ,CTOD('20.01.2010'),  300 ,' 3 4')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 1  ,CTOD('12.10.2010'),  90 ,' 10 20')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 1  ,CTOD('05.12.2009'),  200 ,' 2 2')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 3  ,CTOD('21.01.2010'),  50 ,' 1 20')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 2  ,CTOD('01.01.2009'),  10 ,' 10 30')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 2  ,CTOD('12.10.2010'),  800 ,' 3 20')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 4  ,CTOD('18.01.2009'),  200 ,' 5 10')
INSERT INTO TOVARY (KOD,DATA ,CENA ,OPIS) VALUES ( 1  ,CTOD('12.10.2010'),  80 ,' 4 8')

SELECT TOVARY.* FROM ;
(SELECT MAX_D.KOD,MAX_D.DATA,MAX(TOVARY.CENA) CENA FROM TOVARY INNER JOIN ;
(SELECT KOD,MAX(DATA) DATA FROM TOVARY GROUP BY KOD) MAX_D ;
 ON TOVARY.KOD = MAX_D.KOD AND TOVARY.DATA = MAX_D.DATA GROUP BY  1 , 2  ) MAX_C INNER JOIN TOVARY ;
 ON TOVARY.KOD = MAX_C.KOD AND TOVARY.DATA = MAX_C.DATA AND TOVARY.CENA = MAX_C.CENA ORDER BY TOVARY.KOD
BROW
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос на два максимума
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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