-
Пусть есть таблица вида Name varchar(50) (string); P1, P2, P3, P4, P5, P6 number (int) где Name - имя предмета, Рх - обладает ли он признаком №х, значения 0 или 1 пример(выборка): СТОЛ 1 0 0 0 0 1 СТУЛ 0 0 1 1 0 1
Еще есть группы признаков. Г1, Г2, Г3, Г4, Г5, Г6, Г12, Г13, Г14, Г15, Г16, Г23, Г24, Г25, Г26, Г123, Г124, Г125, Г126
где, Г123 - группа, в которую должны попасть предметы, обладающие признаком 1,2,3 одновременно.
задача такая надо распихать предметы по группам
При этом, эти предметы не должны попасть ни в одну группу "младше" или "ровесницу". (группа считается младше, если признаков включает меньше. При равенстве "старшинства" группы, считаем из "ровесниками")
собственно, я решил, но плохо(т.к. времени не было думать. портянкой case when then else case when then else case when then else case when then else case на три экрана :)). Хотелось бы посмотреть как можно изящно сделать.
-
т.е. один предмет принадлежит только одной группе, максимально "старшей".
-
Я не очень понял условия задачи, но, ИМХО, тут "пахнет" битовой маской, нет?
-
> МХО, тут "пахнет" битовой маской, нет?
ну так под нее и хотел как-то загнать.. но времени не хватило.
написал 6 функций, вычисляющих px, и по огромной табле запустил на ночь. insert into tmp select id, name, f1(id), f2(id), ... from table вот с этой tmp возился. Пока не потребовали "давай прямо ща что есть!!"
Посмотрю-подумаю. Интересно, да и не в последний раз, кажется, потребуется..
-
>AV © (17.04.12 12:09) 1. Примера исходных данных нет; 2. Структуры данных нет; 3. Текущего запроса, возвращающего требуемое, нет. Адская мешанина знаков похоронила смысл.
-
как же так!
> 1. Примера исходных данных нет;
> пример(выборка): > СТОЛ 1 0 0 0 0 1 > СТУЛ 0 0 1 1 0 1
> 2. Структуры данных нет;
> Name varchar(50) (string); P1, P2, P3, P4, P5, P6 number > (int)
> 3. Текущего запроса, возвращающего требуемое, нет.
select Name, P1, P2, P3, P4, P5, P6 from tableA > СТОЛ 1 0 0 0 0 1 > СТУЛ 0 0 1 1 0 1
> Адская мешанина знаков похоронила смысл.
ну не знаю.. старался, вроде.
-
>AV © (26.04.12 16:54) [5]>как же так! а вот так: with q as (select 'СТОЛ' Name, 1 P1, 0 P2, 0 P3, 0 P4, 0 P5, 0 P6 from table A) >select Name, P1, P2, P3, P4, P5, P6 from tableA если он возвращает то, что нужно, то в чем проблема? что внутри Ваших f1, f2 и т.д.? какой набор полей надо получить? пока-что видно лишь некий поток сознания
-
Не знаю или я правильно понял суть проблемы, но что-то напрашивается вот такое: P1+2*P2+4*P3+8*P4+16*P5+32*P6 и получаем номер группы.
-
ну или если кол-во групп меньше чем 2^6, то создать доп таблицу с сответствием результата P1+2*P2+4*P3+8*P4+16*P5+32*P6 конкретной группе. тут и учтешь и старшинство ровестников и пр.
типа: select a.name, b.groupname from source_table a, dict_table b where a.P1+2*a.P2+4*a.P3+8*a.P4+16*a.P5+32*a.P6 = b.idgroup
таблица dict_table idgroup groupname ----------------------- 0 ХЗ 1 Г1 2 Г2 3 Г12 4 Г3 ... 63 ХЗ
|