Знатоки Sql, помогите пожалуйста написать запросы, а то без них курсовик никак не сдать, а свои мысли уже иссякли...
1. Тип(ы) снаряда, имеющий наибольшее значение отношения числа попаданий к
числу выстрелов. Упорядочить по названию типа.
2. Все пары различных бортовых номеров, принимавших участие только в одних
и тех же учениях. Упорядочить по первому номеру и по второму.
Вложение | Размер |
---|---|
Структура бд | 55.78 kb |
Моё мнение как администратора ресурса:
Ресурс предназначен не для поиска добрых дядей, которые сделают за вас домашние задания и упражнения: здесь люди заняты серьёзным делом. Тратить своё время на тех, кто пишет курсовую, но не в состоянии хотя бы попытаться решить в общем-то несложную задачу не вижу смысла.
Пытался решить, притом не
Пытался решить, притом не однократно, результат один и тот же:"запрос не правильный, идите думайте".
Вы на бумажке решаете что ли?
Вы на бумажке решаете что ли? Поставьте СУБД себе на компьютер, выполните запросы, которые вы придумали. Покажите нам что придумали и что не получается - это будет предметный разговор вас как человека, который хочет чему-то научиться, а не просто хочет, чтобы за него всё сделал добрый дядя. Человеку, который что-то пытается сделать, хочет чему-то научиться не грех и помочь.
Субд поставлено, базы созданы
Субд поставлено, базы созданы и заполнены.
1
2
Можете дамп таблиц с данными
Можете дамп таблиц с данными прикрепить? Чтобы я у себя загнал.
Навскидку видно, что нигде нет ORDER BY и кроме того непонятно зачем DISTINCT, да и скобки вначале тоже лишнее.
В постгрессе я новичок, где
В постгрессе я новичок, где взять дамп?
По поводу первого запроса мне сказали, что так как у меня написано, процент попаданий берётся только по одному учению, а надо за все бои.
не скопировал последнюю строку, там было order by tip
Задачу вам тоже сформировали
Задачу вам тоже сформировали мутно, вот и уточнять приходится. Препод ваш видимо тоже не очень шарит. Я же говорю без данных всё-равно что вилами по воде водишь, надо данные и пробовать реально что получается.
Дамп можно программой
pg_dump имя_базы > dump.sql
сделать. Не знаю как у вас по дефолту формат настроен, нужен дамп в текстовом виде - если что ключи почитайте.
Сделал дамп -- -- PostgreSQL
Сделал дамп
Первый запрос, я бы сделал
Первый запрос, я бы сделал так. Не знаю насколько изящно это, но работает:
SELECT tmp1.tip FROM
(SELECT max(rezultat.popadaniy*10/rezultat.vistrelov) AS otn, ucheniya.data,snarydi.tip
FROM rezultat
INNER JOIN ucheniya ON rezultat.data=ucheniya.data
INNER JOIN texnika ON texnika.id_texniki=rezultat.id_texniki
INNER JOIN pushki ON pushki.id_pushki=texnika.id_pushki
INNER JOIN snarydi ON snarydi.id_snaryda=pushki.id_snaryda
GROUP BY ucheniya.data,snarydi.tip) AS tmp1
INNER JOIN
(SELECT max(rezultat.popadaniy*10/rezultat.vistrelov) AS otn, rezultat.data
FROM rezultat
GROUP BY data) AS tmp2
ON tmp1.otn=tmp2.otn AND tmp1.data=tmp2.data
ORDER BY tmp1.tip;
Пояснения (если нужны, конечно). Первая виртуальная таблица tmp1 делается с таким количество INNER JOIN, чтобы вытащить название типа и получить таблицу вида:
где как мы видим даны даты учений, типы снарядов, которые участвовали в учениях и максимальное отношение попаданий к числу выстрелов для данных типов снарядов умноженное на 10. На 10 умножаем потому, что результатом деления является число меньше 1 и если не умножать то нет разницы что делили скажем 5/10 или 8/10 - всё равно целое будет 0. Можно, конечно, заморачиваться с приведением типов, но мне было лень: если нужно делайте сами, а я просто умножил на 10.
Вторая виртуальная таблица tmp2 не содержит типов снарядов, зато содержит нужное нам отношение попаданий к числу выстрелов наибольшее за всю дату учений без привязки к типу снарядов:
Всё что осталось сделать: соединить обе таблицы и получить нужный нам тип, упорядочив его по названию, что и сделано.
Спасибо, только вот как
Спасибо, только вот как сделать чтоб выводил только один тип снаряда или 2 (3), если у них процент попаданий одинаковый. LIMIT'ом как я понимаю тут не отделаешься..
Я не пойму тогда, вам же
Я не пойму тогда, вам же сказали для каждого учения вывести? Вот для каждого и выводится. Не нужны дубли в результате - DISTINCT добавьте.
У вас нет одинаковых процентов попаданий, если посмотрите таблицу, но в принципе и это можно сделать, (предположительно - сейчас некогда проверять) если убрать max из первой виртуальной таблицы.
Идею понял, первый запрос
Идею понял, первый запрос сделал
Помогите пожалуйста со вторым.
SELECT a.id, b.id FROM
Не знаю что там за бортовые номера, структуре не указано, так что вытягивает пары айдишников техники. Называется это дело кортезианское произведение (cross join, декартово произведение, гуглить по этим терминам), его задает неравенство в условии обединения, дальше мы уже просто ограничиваем совпадающими датами и сортируем.
P.S
Мой уважаемый гуру, учитель и тимлид прибил бы меня за такие названия столбцов. Хотите писать английскими буквами - учите английский, не знаете - гугл транслэйт под рукой. Это элементарная этика кодинга.
Боттовые номера это и есть
Боттовые номера это и есть айди техники.
В результате он выведет все пары бортовых номеров, которые вместе были на учениях, а надо только тех, которые всегда вместе были на учениях.
То есть:
-------------------------------
|бортовой номер|дата |
|2 |21.12.89|
|5 |21.12.89|
|3 |21.12.89|
|3 |22.12.89|
|4 |22.12.89|
|5 |22.12.89|
-------------------------------
должен выдать пару 3 и 5 и всё.