Альтернатива частичному (неагрегированному столбцу) в группе [проблема инвентаризации Олливандера на хакерранке] - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь решить https://www.hackerrank.com/challenges/harry-potter-and-wands/problem

При правильной настройке mysql можно выполнить следующие действия:

select w.id, wp.age, min(w.coins_needed), w.power from wands w
join wands_property wp
on wp.code = w.code and wp.is_evil=0
group by w.code
order by w.power desc, wp.age desc;

Но настройка mysql хакерранка не допускает частичной группировки. Выдает ошибку

Список SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'run_eootvjd0lna.w.id', который функционально не зависит от столбцов в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by

Поэтому я хотел бы сначала отфильтровать все дубликаты для данного кода в таблице wands и оставить только те строки, которые имеют минимальное coins_needed. Таким образом, я могу затем присоединиться к wands_property в извлеченной таблице.

Хотел бы получить предложение по извлечению только релевантных минимальных строк coins_needed, чтобы его можно было использовать в дальнейшем.

PS: Я создал sqlfiddle с примерами данных здесь

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Вот мое Объяснение решения (окончательное решение в шаг 3 ):

Шаг 1:

Фильтрация строк с минимальным количеством монет, необходимых на основе мощности и кода. Почему код и мощность, потому что требование требует от нас фильтрации по возрасту и мощности, а возраст имеет 1-1 отношение к коду, поэтому код и мощность являются логическими местами для фильтрации

select w2.code, w2.power, min(w2.coins_needed) coins
from wands w2
group by w2.code, w2.power

Шаг 2:

Используйте эту таблицу только с отфильтрованными строками, чтобы получить все столбцы таблицы палочек

select w.id, wp.age, w.code, min(w.coins_needed), w.power  from wands w
join (
        select w2.code, w2.power, min(w2.coins_needed) coins from wands w2
        group by w2.code, w2.power
      ) wcp
on wcp.code = w.code and wcp.power = w.power and wcp.coins = w.coins_needed

Шаг 3:

Последний шаг состоит в том, чтобы присоединиться к wands_property с новой таблицей, которую мы получили в шаге 2, и упорядочить ее в соответствии с требованиями задачи

select w.id, wp.age, w.code, min(w.coins_needed), w.power  from wands w
join (
        select w2.code, w2.power, min(w2.coins_needed) coins from wands w2
        group by w2.code, w2.power
      ) wcp
on wcp.code = w.code and wcp.power = w.power and wcp.coins = w.coins_needed
join wands_property wp
on wp.code = w.code and wp.is_evil=0
order by w.power desc, wp.age desc ;
0 голосов
/ 10 октября 2019

Я не уверен, правильно ли я понял

Но с

select w.id, w.code, w2.coins_needed, w.power
, wp.age 
from wands w
inner join (SELECT code, Min(coins_needed) coins_needed From Wands Group by code)  w2 
on w.code = w2.code and w.coins_needed = w2.coins_needed
join wands_property wp
on wp.code = w.code and wp.is_evil=0

Вы получаете

id  code    coins_needed    power   age
1   10      100             2       100
3   20      300             3       200
8   40      300             4       400

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...