#sql #comparison #dimensions
Вопрос:
Я пытаюсь написать SQL-запрос, в котором будут извлечены данные со всеми элементами и их размерами, и должно быть выполнено следующее условие: длина gt;=20 ИЛИ ширина gt;gt;=14 ИЛИ высота gt;gt;gt;=10 (все элементы, которые не поместились бы в контейнер 20x14x10). Проблема в том, что высота может быть больше длины (представьте, что вы переворачиваете предмет в пространстве). Я написал код, но не думаю, что он будет охватывать все случаи. Ниже приведен код, который я пробовал:
select items.bin_id, items.bin_type_name, items.bin_usage_name, items.isbn, items.boo, items.quantity, ma.pkg_height, ma.pkg_width, ma.pkg_length, ma.pkg_weight, items.owner from items left join BOOKER.D_MP_PHYSICAL_ITEMS ma on items.boo = ma.asin where ((ma.pkg_length gt;= 20 AND ma.pkg_width gt;= 14 AND ma.pkg_height gt;= 10) OR (ma.pkg_length gt;= 14 AND ma.pkg_width gt;= 10 AND ma.pkg_height gt;= 20) OR (ma.pkg_length gt;= 10 AND ma.pkg_width gt;= 20 AND ma.pkg_height gt;= 14) OR ((ma.pkg_length gt;= 20 AND ma.pkg_width gt;= 10 AND ma.pkg_height gt;= 14) OR (ma.pkg_length gt;= 14 AND ma.pkg_width gt;= 20 AND ma.pkg_height gt;= 10) OR (ma.pkg_length gt;= 10 AND ma.pkg_width gt;= 14 AND ma.pkg_height gt;= 20))
Другая идея, которая у меня была, состояла в том, чтобы выбрать максимальное значение из размеров элемента и проверить, больше ли оно 20, затем выбрать минимальное значение и посмотреть, больше ли оно 10, и проверить, больше ли последнее число 14 (в случае, если два первых значения дают ЛОЖЬ), но я не могу поместить его в SQL
Ответ №1:
Я предполагаю, что приведенная ниже логика будет работать (в основном я пытался написать запрос на логику, о которой вы упомянули в более поздней части вашего вопроса).:
with temp_cte as ( select items.*, ma.*, Select dim from (SELECT dim, row_number() over (order by dim desc) as rn FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 1) as length, Select dim from (SELECT dim, row_number() over (order by dim desc) as rn FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 2) as height, Select dim from (SELECT dim, row_number() over (order by dim desc) as rn FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 3) as width from items left join BOOKER.D_MP_PHYSICAL_ITEMS ma on items.boo = ma.asin where length gt;= 20 or height gt;= 14 or width gt;= 10 ) Select bin_id, bin_type_name, bin_usage_name, isbn, boo, quantity, pkg_height, pkg_width, pkg_length, pkg_weight, owner from temp_cte;