Конференция "Базы" » Выборка без Case, sql любой, лучше oracle
 
  • AV © (17.04.12 12:09) [0]
    Пусть есть таблица вида
    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
    на три экрана :)).
    Хотелось бы посмотреть как можно изящно сделать.
  • AV © (17.04.12 12:29) [1]
    т.е. один предмет принадлежит только одной группе, максимально "старшей".
  • Ega23 © (17.04.12 12:50) [2]
    Я не очень понял условия задачи, но, ИМХО, тут "пахнет" битовой маской, нет?
  • AV © (17.04.12 13:05) [3]

    > МХО, тут "пахнет" битовой маской, нет?

    ну так под нее и хотел как-то загнать..
    но времени не хватило.

    написал 6 функций, вычисляющих px, и по огромной табле запустил на ночь.
    insert into tmp
    select id, name, f1(id), f2(id), ...
    from table
    вот с этой tmp возился.  Пока не потребовали "давай прямо ща что есть!!"

    Посмотрю-подумаю. Интересно, да и не в последний раз, кажется, потребуется..
  • Кщд (26.04.12 16:35) [4]
    >AV ©   (17.04.12 12:09)
    1. Примера исходных данных нет;
    2. Структуры данных нет;
    3. Текущего запроса, возвращающего требуемое, нет.
    Адская мешанина знаков похоронила смысл.
  • AV © (26.04.12 16:54) [5]
    как же так!


    > 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


    > Адская мешанина знаков похоронила смысл.

    ну не знаю.. старался, вроде.
  • Кщд (27.04.12 09:05) [6]
    >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 и т.д.?
    какой набор полей надо получить?

    пока-что видно лишь некий поток сознания
  • Очень злой (27.05.12 20:55) [7]
    Не знаю или я правильно понял суть проблемы, но что-то напрашивается вот такое:
    P1+2*P2+4*P3+8*P4+16*P5+32*P6  и получаем номер группы.
  • Очень злой (27.05.12 21:19) [8]
    ну или если кол-во групп меньше чем 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              ХЗ
 
Конференция "Базы" » Выборка без Case, sql любой, лучше oracle
Есть новые Нет новых   [119662   +92][b:0][p:0.001]