|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
ВладимирМ, а вот то, что у меня получилось (точнее не получилось) и не могу понять почему ошибка в счетчике. Не поможете? Приложил свой вариант, потому что, если честно, я Ваш код вообще не понял, и пытаюсь понять, что мне проще - разобраться с Вашим кодом или допилить свой (хоть и корявый). А так как мне нужно это сделать завтра, то вообще не знаю на чем сконцентрироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 19:31 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
Формируется еще один курсор с именем curFromTo, в котором записана "карта соответствия" старых групп (FROM) и новых (ТО) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 20:30 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
Логика достаточно простая, но из-за обилия макроподстановок код становится практически не читаемым. Это одна из причин, по котрой, по возможности, использование макроподстановок следует избегать. Впрочем, в данной задаче без этого не получится, даже если количество уровней будет строго фиксировано. Идея моего кода заключается в следующем. 1. Делаю выборку с группировкой по уровню на 1 больше, чем анализируемый уровень. Например, если анализирую возможность "схлопывания" уровня Stage3, то группировку делаю по двум полям: Stage2, Stage3. Если же анализирую возможность "схлопывания" уровня Stage2, то группировку делаю уже по трем полям: Stage1, Stage2, Stage3 Результат этой группировки записывается в курсор с именем curNeedCollaps - список групп, которые НАДО схлопнуть 2. Далее опираясь на полученный список схлопываю соответствующий уровень. В смысле, из исходной таблицы извлекаются только те записи, коды которых оказались в курсоре curNeedCollaps. Здесь есть некая тонкость в том, по каким кодам искать соответствие исходных данных и выборки curNeedCollaps. Но пока это не важно 3. Опираясь на полученный результат схлопывания очердного уровня формирую "карту соответствия". Делаю запись в curFromTo 4. Записываю результат схлопывания в итоговый курсор 5. Записываю в дополнительный курсор curCollaps все то, что было схлопнуто, чтобы при следующих шагах цикла исключить эти записи из рассмотрения. Они уже не нужны. Опять же, есть некоторя тонкость по формированию условия отбора. 6. По окончании цикла делаю схлопывание по ВСЕМ полям Stage. =================================================== Что лучше, писать свой код или изучать чужой? Ну, вопрос философский В данной задаче простого выхода не будет. Сама идея алгоритма не сложная, но из-за большого количества макроподстановок его трудно понять. Вне зависимости от того, будете Вы разбирать мой код или писать собственный. Трудно будет "продраться" через все эти макроподстановки. Мне будет также тяжело понять Ваш код, как Вам - мой. Но, на первый взгляд, я не вижу у Вас динамического изменения количества анализируемых групп. Нельзя отбрасывать ранее проанализированные уровни. Количество полей группировки должно расти. А в Вашем коде я этого не вижу. Вы все время делаете группировку только по 2 уровням. А этого - недостаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 20:56 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
ВладимирМ, еще раз спасибо. Я делал группировку всегда по двум уровням, исходя из условия, что уровни от большего к меньшему могут только делиться, то есть некое подобие дерева, ветви которого не пересекаются. Наиболее быстрым решением на данный момент, мне показалось запихнуть весь Ваш код в процедуру, на вход которой подавать curData, а на выходе забирать curFromTo. Прогнал тот input, что выкладывал ранее (tmp_ibds), и все равно, присутствуют некорректные объединения. Изменилось только количество уровней до 6 и минимальное значение до 30 (его в программе, разумеется, min value изменил). Не могли бы подсказать, в чем может быть причина? Извините за столь продолжительное беспокойство. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 23:42 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
ВладимирМ, доброе утро. Решил дописать вчерашний пост. Когда я говорю, что некоторые объединения некорректны, я имею ввиду, что кол-во элементов в объединенных группах меньше установленного минимального. В программе процедура (Ваш код) вызывается 16 раз, из них: 3 корректно (2 из них группируются в самые крупные объединения) остальные с группами < 30. Интересно, что в тех случаях, где группировка некорректна, видна некая зависимость: либо первые 6 групп не объединяются, либо первые 25, причем 6 или 25, видимо, зависит от количества элементов(?). Правда есть еще не объединенные группы, кроме первых. В приложении файл с результатами. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 09:01 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
Была лишняя проверка на количество элементов в группе. В смысле, если в группе оказался один элемент, то даже если его сумма меньше минимума он все равно исключался из рассмотрения. Это условие осталось в коде, но закомментированное. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 11:04 |
|
Группировка (не простая)
|
|||
---|---|---|---|
#18+
ВладимирМ, это уже, наверно, похоже на флуд, но та программа, которую я написал, и выложил ранее, работает. Она вываливается с ошибкой "Record is out of range", но все, что успела сделать до этого - правильно, то есть 3 из 16 этапов завершились успехом. Пока не могу понять откуда ошибка "Record is out of range". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2011, 11:04 |
|
|
start [/forum/topic.php?fid=41&msg=37477233&tid=1584086]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 136ms |
0 / 0 |