
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
06.07.2004, 23:09:32
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
Вопрос к знатокам SQL. Есть таблица поставок Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Нужно выбрать последние минимальные цены: Код: plaintext 1. Приходится делать 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2004, 23:44:49
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
1. 7 запросов - это явный перебор, причем с большим избытком. 2. Что такое последние минимальные? Есть более четкая постановка? В приведенном примере цена 26.80 и не последняя, и не минимальная. 3. Last и First возвращают последнюю и первую запись согласно порядку занесения в таблицу, а не согласно сортировке. 4. Непонятно, что должна делать функция Current для поля, по которому не сделана группировка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2004, 23:56:18
|
|||
|---|---|---|---|
Двойная группировка |
|||
|
#18+
Саныч, последние - по дате, а не по порядку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2004, 23:57:27
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
ТемныйСаныч, последние - по дате, а не по порядку Это ты на мое 2 или на мое 3? Если 2, то я так и понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.07.2004, 23:58:24
|
|||
|---|---|---|---|
Двойная группировка |
|||
|
#18+
На 2-е. 3-е здесь вообще не причем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2004, 00:00:31
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
Код: plaintext 1. 2. 3. 4. 5. Красным я обозначил минимальную сумму и последнюю дату. Зеленое - то, что выбрал автор по непонятно какому критерию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2004, 00:26:36
|
|||
|---|---|---|---|
Двойная группировка |
|||
|
#18+
Саныч, то что ему надо, если я правильно понял получить а) поставки: 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 запросов -это очень похоже на правду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2004, 07:43:35
|
|||
|---|---|---|---|
Двойная группировка |
|||
|
#18+
Хотя спокойно можно обойтись и двумя ( не считая подзапросов) 1) q1 Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.07.2004, 11:07:51
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
Теперь осталось дождаться автора, который подтвердит, что VIG прочитал его мысли верно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2004, 15:35:21
|
|||
|---|---|---|---|
|
|||
Двойная группировка |
|||
|
#18+
Огромное спасибо всем, кто уделил внимание моей теме. Особенно (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(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.07.2004, 16:01:07
|
|||
|---|---|---|---|
Двойная группировка |
|||
|
#18+
Рад. Только не понял ,зачем 4 запроса ,если можно обойтись двумя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=45&mobile=1&tid=1673305]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 398ms |

| 0 / 0 |
