#0
by craxx
Имеются цепочки чисел, к примеру, для простоты 1-2-4-8-11 и 3-5-6-7-9-10, представленные в виде таблицы из двух столбцов: Предыдущее Следующее 1 2 2 4 4 8 8 11 3 5 5 6 6 7 7 9 9 10 Одно и то же число присутствует только в одной цепочке и не повторяется в таблицы больше одного раза Необходимо с помощью SQL-запроса преобразовать ее в следующую таблицу Первое Текущее 1 1 1 2 1 4 1 8 1 11 3 3 3 5 3 6 3 7 3 9 3 10 Подскажите хотя бы идеи, куда копать.
#20
by GANR
1С-ным статическим запросом такое не осилить. Там ведь надо искать для каждой цифры первый элемент цепочки. Вот с рекурсивными CTE в скуле еще можно поизворачиваться. И то там системные ограничения на глубину рекурсии могут мешать.
#27
by NorthWind
Начала цепочек выдернуть несложно. Более сложно собрать в кучку как написано в результате
#28
by Ildarovich
Можно написать запрос фиксированной длины из 100 (с запасом) подзапросов по схеме из ссылки . С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов. Это очень большое число. Достаточное для любых, даже теоретических целей. Например, потому, что для записи исходных данных описания такой длинной цепочки не хватит емкости всех имеющихся на Земле жестких дисков. Отсюда Зеттабайт следует, что в конце 2015 года в интернете было 8 зеттабайт, то есть примерно 2^67 байт. Даже при использовании CTE нужно будет использовать принцип из . Матричное умножение, которое лежит в основе указанного способа - известный способ ускорения многих алгоритмов. поле для упорядочивания типа "уровень" - да, оно бы выручило
#29
by craxx
я же написал, последующий номер всегда больше предыдущего и он уникален в пределах колонки
#30
by craxx
>>С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов. цепочки линейные, поэтому не 2^100 а ровно 100 и получится, а этого мало.
#31
by Ildarovich
Думаю, вы не поняли сути метода из . Каждый следующий подзапрос в нем удваивает длину выявляемой цепочки. Поэтому если в вашем случае максимальная длина цепочки - 100, то нужно всего 7 подзапросов.
#32
by NorthWind
Берете число1 из простого соединения таблицы самой с собой по таб1.число2=таб2.число1. затем вычитаете из исходной таблицы этот результат. Получаете начала цепочек. В нашем случае это будет 1;2 и 3;5. Но вот как потом все это накрутить так чтобы получить результат - я чет теряюсь.
#33
by craxx
начала цепочек я сам уже выдернул. а дальше, да, транзитивное замыкание, вот как реализовать?
#34
by Ildarovich
Примерно так: Здесь три подзапроса и максимальная длина выявляемых цепочек - 8. Если нужно больше - добавьте в конец нужное число подзапросов по той же логике.
#35
by NorthWind
похоже, никак. Вот здесь похожий пример , надо выдернуть из таблицы всех руководителей (прямых и непрямых) сотрудника, с учетом того что в строке указан табельный номер только непосредственного руководителя, а у того руководителя на вышестоящего руководителя и т.д. Ответ - нельзя.
#36
by NorthWind
точнее, можно, но только для частных случаев. В общем для произвольной длины цепи - нет.
#38
by Ildarovich
Произвольная длина цепи бывает только в теории. На практике она всегда чем-то ограничена. Хотя бы размером места на диске. Поэтому решение типа , которое легко обобщить на любое РЕАЛЬНОЕ число уровней и говорит о том, что решение имеется.
#39
by Ildarovich
+ Последнее условие нужно переписать так: Смысл условия в том, чтобы из всех связей выделить только те, началом которых являются элементы, не являющиеся концом ни одной связи, кроме связи с самим собой.
#41
by Ildarovich
Попробуйте запрос из + прежде чем так утверждать. Его можно в консоли запустить, если консоль таблицу значений как параметр принимает.
#43
by RomanYS
может я задачу не понял. Если есть еще 3я колонка с порядковые номером, то задача не сложна 1. соединением находим начала 2. нумеруем начала 3. соединяем начала и исходную таблицу
#47
by lock19
"Одно и то же число присутствует только в одной цепочке и не повторяется в таблицы больше одного раза" "1 2 2 4 4 " ???
#49
by RomanYS
+ можно ли считать таблицу связей упорядоченной (пронумерованной)? Или порядок в примере только для наглядности?
#51
by lock19
Нужно получить данные по упорядоченности и убрать пересечения для первого столбца. Далее сопоставлять по данным порядка и величине элементов. Примерно так.
#52
by Ildarovich
С упорством, достойным лучшего применения, хочу донести, где, по моему мнению вы не правы. А если в запрос добавить еще 93 "каскада"? - Это легко сделать прямо сейчас. Это будет статический запрос. Существенно менее длинный по размеру, чем многие запросы в ЗУП. Тогда вы тоже скажете: "длиной не более 1 000 000 000 000 000 000 000 000 000 000" и "в общем виде" это как бы не одно и тоже? Пытаюсь обратить внимание на разницу между математикой, которая имеет дело с абстракциями (конструкциями, не существующими в природе) и программированием, как инженерной дисциплиной, которая позволяет создавать реально работающие системы, построенные из конкретных объектов материального мира для отражения объектов материального мира, число которых при программировании можно считать конечным. Число атомов во Вселенной имеет оценку, выраженную числом с конкретным количеством нулей. Для которого можно посчитать число необходимых каскадов удвоения. Поэтому если исходная задача является задачей программирования, то запрос, построенный по принципу, представленному в , ее, на мой взгляд, решает.
#55
by NorthWind
если исходить из "жизненности", то и курсор может быть неплох, и даже извлечение данных на клиент и получение результата "навигационным методом". Пока строк не сильно много - не страшно :)
#56
by Ildarovich
По словам самого Гейтса, он этого не говорил: _(число). + Пока не соображу, как можно использовать упорядоченность, но было бы очень интересно.
#57
by RomanYS
для упорядоченной(пронумерованной) таблицы будет работать без каких-либо заморочек. Писать запрос лень. Только если Вы будете настаивать что это невозможно).
#58
by ovrfox
create table #Raw(A int, b int) insert #Raw Select 1 , 2 union all select 2, 4 union all select 4 , 8 union all select 8 , 11 union all select 3 , 5 union all select 5 , 6 union all select 6 , 7 union all select 7 , 9 union all select 9, 10 with cte (a , b ) as ( select a,a as b from #raw tout where not exists (select 1 from #raw tin where tin.b = tout.a) union all select cte.a,tout.b from #raw tout inner join cte on cte.b = tout.a) select * from cte Работает и так
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Защита конфигурации 1С с помощью WinCrypt. автора Федор aka DeFor
- SQL State: HYT00 Native: 0 Message: [Microsoft][ODBC SQL Server Driver]Time
- С помощью какой агрегатной функции можно узнать количество записей в резуль
- 1cv8 SQL: Имя SQL сервера и имя SQL базы данных
- Совместимость MS SQL 2000 и MS SQL 2005 ?
- Камин 3.0 откуда выдернуть поля
В этой группе 1С
- Розница 2. 100% скидка на чек
- УПП Статистика Форма П-6
- Программно отключить/удалить нужный элемент отбора в динамическом списке
- Кудир на УСН не попадает в расходу учитываемые
- 1с УПП 1.3 ввод на основании
- Отчет по эквайрингу УТ 11.1
- КА 2.2 Ячеистое хранение и упаковки номенклатуры.
- Помогите проанализировать ТЖ
- 1C Розница и Viki Print 57 ф проблемы при печати чеков со скидками.
- Ошибка 2304 при обмене через ЭДО (Такском) в УПП как лечить?
- синхронизация розница 2.2 и БП 3.0
- как в запросе отобрать Номенклатуру которой нет в регистре сведений?
- УФ. Внешняя обработка. Заголовок формы взять с синонима обработки. Как?
- Гиперссылка на сайт в печатной форме табличного документа
- ЗУП 2.5 Отражение ЗП. Как настроить заполнение по статьям: ПФР, ФСС, ФСС НС ?
- Пропал план счетов 8.3
- Переход с БСО 2.0 на 3.1
- Работает ли Атол 11ф без ФН
- Как безболезненно поменять макет КА 1.1
- ЗУП 2.5 Новый расчет страховых взносов