2014-03-25 2 views
6

Я не уверен, что то, что я ищу, возможно, но его, безусловно, интересно подумать. Моя цель - оптимизировать структуру склада, но эта проблема применима и к другим сценариям.Использование Oracle SQL в качестве подходящего механизма

У меня есть список мест, расстояние до двери и зона они находятся в (например, зоны A = рефрижераторный, Зона B = Температура окружающей среды):

 
Location Zone Distance 
A1   A  1 
A2   A  3 
A3   A  5 
A4   A  7 
B1   B  2 
B2   B  4 
B3   B  6 
B4   B  8 

У меня также есть список продуктов, количество раз они были собраны, и их зона (зона A = Продукты, которые должны быть охлаждены, зона B = Продукты, которые должны быть вне холодильной, зона A/B = продукты без ограничения)

 
Product  Zone Pick per day 
Milk  A  8 
Lettuce  A/B  7 
Bread  B  6 
Chocolate B  5 
Tomatoes A/B  4 
Dry Pasta B  3 
Beef  A  2 
Chicken  A  1 

Если Меня интересовала только оптимизация пройденного расстояния, чтобы выбрать продукт, я бы поставил Самый подходящий для двери. Я сделал это, присоединив обе таблицы через ROW_NUMBER и ORDER BY Distance и Pick.

ОДНАКО, я действительно забочусь о продуктовой зоне, так как я не могу хранить свой Хлеб в охлажденной области (это может стать сырым). Кроме того, я знаю, что салат можно хранить в охлажденной или неохлаждаемой зоне.

ДОПОЛНИТЕЛЬНО, должно быть условие, которое обеспечивает все продукты выделяются пространство (8 пространства 8 позиций)

Делать это вручную, я хотел бы получить.

  
Location Zone Distance Product  Zone Pick per day 
A1   A  1   Milk  A  8 
B1   B  2   Lettuce  A/B  7 
A2   A  3   Tomatoes A/B  4 
B2   B  4   Bread  B  6 
A3   A  5   Beef  A  2 
B3   B  6   Chocolate B  5 
A4   A  7   Chicken  A  1 
B4   B  8   Dry Pasta B  3 

Я рассмотрел шаблон соответствия SQL, но не увенчался успехом. Кроме того, я запрограммировал итеративную функцию VBA, которая использует «зарезервированные» пробелы в зонах, но это замедляется для домашнего ПК.

И наконец, спасибо! Я читал сообщения в stackoverflow для всех моих проблем, но этот я не могу решить !!

+0

Вы не храните достаточное количество данных. Если предмет нуждается в охлаждении, эти данные должны быть сохранены. Если зона охлаждена, она также должна храниться. –

+0

Сегрегация выполняется зоной (A переходит в A, B переходит в B, а A/B - A или B). Это то, что вы имеете в виду? –

+0

Любой супермаркет, о котором я когда-либо слышал, прячет молоко как можно дальше от входной двери. О, подождите ... вы сказали, что хранилище. ;-) Хороший вопрос, голосуйте от меня. – unigeek

ответ

2

a. начать с этого SQL:

select * from product p left outer join location l on (INSTR(p.zone, l.zone)>0) order by p.pickperday desc, l.distance asc;

б. написать хранимую процедуру, где вы

  1. создать HashSet
  2. начал цикл по результирующему
  3. взять текущий элемент и если он не Allready в HashSet и место также не Allready в HashSet вставить его в HashSet
  4. вернуть hashsetlist

как wirte такие процедуры: http://docs.oracle.com/cd/B28359_01/java.111/b31225/cheight.htm#CHDCDHJD

для испытания:

CREATE TABLE "PRODUCT" ( "PRODUCT" VARCHAR2(20), "ZONE" VARCHAR2(20), "PICKPERDAY" VARCHAR2(20)); 
CREATE TABLE "LOCATION" ( "LOCATION" VARCHAR2(20), "ZONE" VARCHAR2(20), "DISTANCE" VARCHAR2(20)); 

Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A1','A','1'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B1','B','2'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A3','A','5'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B2','B','4'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A2','A','3'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B3','B','6'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('B4','B','8'); 
Insert into LOCATION (LOCATION,ZONE,DISTANCE) values ('A4','B','2'); 

Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Milk','A','8'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Tomatos','A/B','4'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Bread','B','6'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Dry Pasta','B','3'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Lettuce','A/B','7'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Beef','A','2'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Chocolate','B','5'); 
Insert into PRODUCT (PRODUCT,ZONE,PICKPERDAY) values ('Chicken','A','1'); 
+0

Мне нравится ваше мышление, этот метод обеспечит, чтобы продукты были привязаны к местоположению, следующему за ограничениями в зоне, а оптимизация выполняется с использованием порядка по времени и дистанции. Однако, в некоторых случаях (не это к сожалению) могут быть продукты, которые заканчиваются без пространства, потому что гибкие продукты берут все пятна. Например, салат и помидоры идут в А1 и А2, остальные места «зоны А» (2) недостаточны для оставшихся продуктов «зоны А» (3) Говядина и курица из молока. Есть предположения? –

+0

thx, я бы: 1. подсчитал необходимое пространство для каждой зоны: a'select zone, count (зона) из группы продуктов по зонам; 'и b'select zone, count (зона) из группы местоположений по зоне; '2 усилить проверку с помощью отдельной хэш-карты; используйте зону для ключа и для значения diff от значения зоны ba -> Если вы получаете продукт с более чем одной указанной зоной, вы можете проверить, есть ли в этой области пробел, и если вы вставляете такой элемент, уменьшите пространство в что «Spacehashset» – Gambotic

+0

Можно ли это сделать с помощью рекурсивного запроса вместо написания Java? –

Смежные вопросы