powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Двойная группировка
12 сообщений из 12, страница 1 из 1
Двойная группировка
    #32592372
cheglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос к знатокам SQL. Есть таблица поставок

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
поставки:
id_produkt	id_supplier	date		price	accountable
 1 		 1 		 12 . 10 . 95 	 25 . 00 	Вася
 1 		 1 		 14 . 10 . 96 	 27 . 00 	Петя
 1 		 1 		 11 . 11 . 97 	 26 . 80 	Саша
 1 		 2 		 24 . 08 . 94 	 24 . 80 	Ваня
 1 		 2       		 30 . 11 . 96 	 27 . 10 	Дима
 1 		 2 		 16 . 12 . 97 	 27 . 10 	Олег
 2 		 1 		 22 . 12 . 95 	 55 . 00 	Петя
 2 		 1 		 24 . 10 . 96 	 57 . 00 	Дима
 2 		 1 		 19 . 11 . 97 	 58 . 00 	Алик
 2 		 2 		 14 . 12 . 94 	 55 . 00 	Иван
 2 		 2       		 23 . 10 . 96 	 57 . 00 	Петр
 2 		 2 		 26 . 12 . 97 	 57 . 00 	Леша



Нужно выбрать последние минимальные цены:

Код: plaintext
1.
 1 		 1 	 11 . 11 . 97 	 26 . 80 	Саша
 2 		 2              26 . 12 . 97 	 57 . 00 	Леша


Приходится делать 7! последовательных запросов


Есть ли такая функция, положим current(), которая возвращает текущее поле по аналогии с Last() и First()


Тогда можно было бы в 2 запроса сделать

query1:
Select id_produkt, id_supplier, Max(date), CURRENT(price), CURRENT(accountable) From поставки GROUP BY id_produkt, id_supplier

query2:
Select id_produkt, CURRENT(id_supplier), CURRENT(date), Min(price), CURRENT(accountable) From query1 GROUP BY id_produkt
...
Рейтинг: 0 / 0
Двойная группировка
    #32592392
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
1. 7 запросов - это явный перебор, причем с большим избытком.
2. Что такое последние минимальные? Есть более четкая постановка? В приведенном примере цена 26.80 и не последняя, и не минимальная.
3. Last и First возвращают последнюю и первую запись согласно порядку занесения в таблицу, а не согласно сортировке.
4. Непонятно, что должна делать функция Current для поля, по которому не сделана группировка.
...
Рейтинг: 0 / 0
Двойная группировка
    #32592398
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, последние - по дате, а не по порядку
...
Рейтинг: 0 / 0
Двойная группировка
    #32592399
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ТемныйСаныч, последние - по дате, а не по порядку
Это ты на мое 2 или на мое 3? Если 2, то я так и понял.
...
Рейтинг: 0 / 0
Двойная группировка
    #32592400
Фотография Темный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 2-е.
3-е здесь вообще не причем
...
Рейтинг: 0 / 0
Двойная группировка
    #32592403
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: plaintext
1.
2.
3.
4.
5.
1		1		12.10.95	25.00	Вася
1		1		14.10.96	27.00	Петя
1		1		11.11.97	26.80	Саша
1		2		24.08.94	24.80	Ваня
1		2      		30.11.96	27.10	Дима
1		2		16.12.97	27.10	Олег

Красным я обозначил минимальную сумму и последнюю дату. Зеленое - то, что выбрал автор по непонятно какому критерию.
...
Рейтинг: 0 / 0
Двойная группировка
    #32592416
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч, то что ему надо, если я правильно понял
получить
а)

поставки:
id_produkt id_supplier date price accountable
1 1 12.10.95 25.00 Вася
1 1 14.10.96 27.00 Петя
1 1 11.11.97 26.80 Саша
1 2 24.08.94 24.80 Ваня
1 2 30.11.96 27.10 Дима
1 2 16.12.97 27.10 Олег
2 1 22.12.95 55.00 Петя
2 1 24.10.96 57.00 Дима
2 1 19.11.97 58.00 Алик
2 2 14.12.94 55.00 Иван
2 2 23.10.96 57.00 Петр
2 2 26.12.97 57.00 Леша

б) из а) выбрать
1 1 11.11.97 26.80 Саша
2 2 26.12.97 57.00 Леша

Так что 7 запросов -это очень похоже на правду
...
Рейтинг: 0 / 0
Двойная группировка
    #32592494
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя спокойно можно обойтись и двумя ( не считая подзапросов)
1) q1
Код: plaintext
1.
2.
3.
4.
5.
select p.*
from products p
inner join
       (select id_produkt,id_supplier,max(date) MaxDate
        from products group by id_produkt,id_supplier) as p1
on p.id_produkt=p1.id_produkt and p.id_supplier=p1.id_supplier and p.date=p1.MaxDate
2) q2
Код: plaintext
1.
2.
3.
4.
5.
6.
select q1.*
from q1 
inner join
      (select q1.id_produkt,min(q1.price) price
       from q1 group by  q1.id_produkt
      ) as q11
on q1.id_product=q11.id_product and q1.price=q11.price      
...
Рейтинг: 0 / 0
Двойная группировка
    #32592857
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Теперь осталось дождаться автора, который подтвердит, что VIG прочитал его мысли верно.
...
Рейтинг: 0 / 0
Двойная группировка
    #32595766
cheglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо всем, кто уделил внимание моей теме.
Особенно (c)VIG, который понял меня абсолютно правильно.
И абсолютно правильным был его запрос.
Благодаря ему я нашел 2 логически ошибки в моих 7 запросах:

test1:
SELECT test.id_product, test.id_supplier, Max(test.date) AS [Max-date] FROM test GROUP BY test.id_product, test.id_supplier;
test2:
SELECT test.id_product, test.id_supplier, test.date, test.price, test.accountable FROM test INNER JOIN test1 ON (test.date = test1.[Max-date]) AND (test.id_supplier = test1.id_supplier) AND (test.id_product = test1.id_product) GROUP BY test.id_product, test.id_supplier, test.date, test.price, test.accountable;
test3:
SELECT test2.id_product, Min(test2.price) AS [Min-price] FROM test2 GROUP BY test2.id_product;
test4:
SELECT test.id_product, test.id_supplier, test.date, test.price, test.accountable FROM test3 INNER JOIN test ON (test3.id_product = test.id_product) AND (test3.[Min-price] = test.price);
test5:
SELECT test4.id_product, Max(test4.date) AS [Max-date] FROM test4 GROUP BY test4.id_product;
test6:
SELECT test.id_product, test.id_supplier, test.date, test.price, test.accountable FROM test INNER JOIN test5 ON (test.date = test5.[Max-date]) AND (test.id_product = test5.id_product);
test7:
SELECT test.id_product, First(test.id_supplier) AS [First-id_supplier], First(test.date) AS [First-date], First(test.price) AS [First-price], First(test.accountable) AS [First-accountable] FROM (test INNER JOIN test5 ON (test.id_product = test5.id_product) AND (test.date = test5.[Max-date])) INNER JOIN test3 ON (test.id_product = test3.id_product) AND (test.price = test3.[Min-price]) GROUP BY test.id_product;


1) я сделал петлю, выбирая минимальные цены не из минимальных дат (запросы test5, test6), а из начальной таблицы.
Из-за этой ошибки приходилось делать 2 лишних запроса.
2) я не создал первичный ключ таблицы, а он должен быть таким: id_produkt,id_supplier,date. Из-за этой ошибки
приходилось делать один лишний запрос, так как могли присутствовать строки
1 1 12.10.1995 25,00р. Вася
1 1 12.10.1995 25,00р. Петя
А такого в реальности не бывает.


Теперь мои 4 запроса благодаря (c)VIG выглядят так:

asVIG:
SELECT test_small.id_product, test_small.id_supplier, Max(test_small.date) AS [Max-date] FROM test_small GROUP BY test_small.id_product, test_small.id_supplier;
asVIG2:
SELECT test_small.* FROM asVIG INNER JOIN test_small ON (asVIG.[Max-date] = test_small.date) AND (asVIG.id_supplier = test_small.id_supplier) AND (asVIG.id_product = test_small.id_product);
asVIG3:
SELECT asVIG2.id_product, Min(asVIG2.price) AS [Min-price] FROM asVIG2 GROUP BY asVIG2.id_product;
asVIG4:
SELECT asVIG2.* FROM asVIG2 INNER JOIN asVIG3 ON (asVIG2.price = asVIG3.[Min-price]) AND (asVIG2.id_product = asVIG3.id_product);


P.S. Хотя, согласитесь было бы изящней двумя запросами, если б была такая функция Current().
...
Рейтинг: 0 / 0
Двойная группировка
    #32595870
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рад. Только не понял ,зачем 4 запроса ,если можно обойтись двумя.
...
Рейтинг: 0 / 0
Двойная группировка
    #32596459
cheglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 запроса по два вложенных подзапроса. А чтобы для себя понятней было переделал в 4.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Двойная группировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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