|
Выдернуть начала цепочек с помощью SQL | ☑ | ||
---|---|---|---|---|
0
craxx
05.04.17
✎
17:32
|
Имеются цепочки чисел, к примеру, для простоты 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 Подскажите хотя бы идеи, куда копать. |
|||
1
Господин ПЖ
05.04.17
✎
17:36
|
обойти через fetch и собрать таблицу какую надо
|
|||
2
craxx
05.04.17
✎
17:37
|
(1) задача-голым sql
|
|||
3
Господин ПЖ
05.04.17
✎
17:38
|
(2) fetch - вроде голее некуда
|
|||
4
МихаилМ
05.04.17
✎
17:39
|
какой диалект sql благородный дон.
"голый" - sql . мусье знает толк в извращениях |
|||
5
craxx
05.04.17
✎
17:39
|
(3) в языке запросов 1с нету fetch
|
|||
6
craxx
05.04.17
✎
17:40
|
(4) для простоты пусть будет язык запросов 1с
|
|||
7
Вафель
05.04.17
✎
17:40
|
через транзитивное замыкание конечно же
|
|||
8
Вафель
05.04.17
✎
17:40
|
задача аналогична найти верхнего родителя
|
|||
9
Вафель
05.04.17
✎
17:41
|
вернее всех родителей
|
|||
10
Господин ПЖ
05.04.17
✎
17:41
|
>в языке запросов 1с нету fetch
а причем тут голый sql тогда? |
|||
11
МихаилМ
05.04.17
✎
17:42
|
(5) причем тут "языке запросов 1с"
это и есть "голый" - sql. |
|||
12
GANR
05.04.17
✎
17:43
|
(6) ограничения на потенциально возможную длину цепочки есть?
|
|||
13
Вафель
05.04.17
✎
17:45
|
||||
14
МихаилМ
05.04.17
✎
17:45
|
откуда
в результате взялось 1 1 без него задача понятней |
|||
15
craxx
05.04.17
✎
17:46
|
(12) длина не ограничена
|
|||
16
craxx
05.04.17
✎
17:47
|
(13) не пойдет. необходимо конечное количество запросов.
|
|||
17
craxx
05.04.17
✎
17:49
|
(16) +текст запроса должен быть один для любых цепочек
|
|||
18
DailyLookingOnA Sunse
05.04.17
✎
17:53
|
(16)
Там 2 в степени. Т.е. 10 запросов покрывают 1000 уровней иерархии. |
|||
19
МихаилМ
05.04.17
✎
17:54
|
вы хоть не поленились и делали заготовку кода запроса
с тестовыми данными |
|||
20
GANR
05.04.17
✎
18:02
|
(15) 1С-ным статическим запросом такое не осилить. Там ведь надо искать для каждой цифры первый элемент цепочки. Вот с рекурсивными CTE в скуле еще можно поизворачиваться. И то там системные ограничения на глубину рекурсии могут мешать.
|
|||
21
МихаилМ
05.04.17
✎
18:11
|
(20) легко 1с ным запросом без fetch cte и оконных функций
|
|||
22
GANR
05.04.17
✎
18:12
|
(21) Да!? Длина цепочки-то не ограничена.
|
|||
23
craxx
05.04.17
✎
18:13
|
(21) и как?
|
|||
24
Неверный Параметр И
05.04.17
✎
18:56
|
(23) ISBN 5-93286-125-8, 10 глава
|
|||
25
Неверный Параметр И
05.04.17
✎
19:00
|
Или даже ISBN 13: 978-0-12-369379-2, глава 24
|
|||
26
МихаилМ
05.04.17
✎
19:03
|
да не получится . нужно поле упорядочивания
|
|||
27
NorthWind
05.04.17
✎
19:04
|
Начала цепочек выдернуть несложно. Более сложно собрать в кучку как написано в результате
|
|||
28
Ildarovich
05.04.17
✎
19:12
|
(16) Можно написать запрос фиксированной длины из 100 (с запасом) подзапросов по схеме из ссылки (13). С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов. Это очень большое число. Достаточное для любых, даже теоретических целей.
Например, потому, что для записи исходных данных описания такой длинной цепочки не хватит емкости всех имеющихся на Земле жестких дисков. Отсюда https://ru.wikipedia.org/wiki/Зеттабайт следует, что в конце 2015 года в интернете было 8 зеттабайт, то есть примерно 2^67 байт. Даже при использовании CTE нужно будет использовать принцип из (13). Матричное умножение, которое лежит в основе указанного способа - известный способ ускорения многих алгоритмов. (26) поле для упорядочивания типа "уровень" - да, оно бы выручило |
|||
29
craxx
05.04.17
✎
19:19
|
(28) я же написал, последующий номер всегда больше предыдущего и он уникален в пределах колонки
|
|||
30
craxx
05.04.17
✎
19:21
|
(28) >>С его помощью можно обрабатывать цепочки из 2^100 (два в сотой степени) элементов.
цепочки линейные, поэтому не 2^100 а ровно 100 и получится, а этого мало. |
|||
31
Ildarovich
05.04.17
✎
19:28
|
(30) Думаю, вы не поняли сути метода из (13). Каждый следующий подзапрос в нем удваивает длину выявляемой цепочки. Поэтому если в вашем случае максимальная длина цепочки - 100, то нужно всего 7 подзапросов.
|
|||
32
NorthWind
05.04.17
✎
19:28
|
(22) Берете число1 из простого соединения таблицы самой с собой по таб1.число2=таб2.число1. затем вычитаете из исходной таблицы этот результат. Получаете начала цепочек. В нашем случае это будет 1;2 и 3;5. Но вот как потом все это накрутить так чтобы получить результат - я чет теряюсь.
|
|||
33
craxx
05.04.17
✎
19:30
|
(32) начала цепочек я сам уже выдернул. а дальше, да, транзитивное замыкание, вот как реализовать?
|
|||
34
Ildarovich
05.04.17
✎
19:40
|
Примерно так:
ВЫБРАТЬ
Здесь три подзапроса и максимальная длина выявляемых цепочек - 8. Если нужно больше - добавьте в конец нужное число подзапросов по той же логике. |
|||
35
NorthWind
05.04.17
✎
19:48
|
(33) похоже, никак. Вот здесь похожий пример http://www.cyberguru.ru/database/database-theory/relational-algebra-page15.html, надо выдернуть из таблицы всех руководителей (прямых и непрямых) сотрудника, с учетом того что в строке указан табельный номер только непосредственного руководителя, а у того руководителя на вышестоящего руководителя и т.д. Ответ - нельзя.
|
|||
36
NorthWind
05.04.17
✎
19:49
|
точнее, можно, но только для частных случаев. В общем для произвольной длины цепи - нет.
|
|||
37
Ildarovich
05.04.17
✎
19:53
|
+(34) Напишу на всякий случай готовый запрос для цепочек длиной не более 128:
ВЫБРАТЬ
|
|||
38
Ildarovich
05.04.17
✎
20:03
|
(36) Произвольная длина цепи бывает только в теории. На практике она всегда чем-то ограничена. Хотя бы размером места на диске. Поэтому решение типа (37), которое легко обобщить на любое РЕАЛЬНОЕ число уровней и говорит о том, что решение имеется.
|
|||
39
Ildarovich
06.04.17
✎
08:28
|
+(37) Последнее условие нужно переписать так:
ГДЕ
Смысл условия в том, чтобы из всех связей выделить только те, началом которых являются элементы, не являющиеся концом ни одной связи, кроме связи с самим собой. |
|||
40
Naf2017
06.04.17
✎
08:33
|
Легко вытянуть все первые, но пары не вытянуть в общем случае
|
|||
41
Ildarovich
06.04.17
✎
08:45
|
(40) Попробуйте запрос из (37)+(39) прежде чем так утверждать. Его можно в консоли запустить, если консоль таблицу значений как параметр принимает.
|
|||
42
NorthWind
06.04.17
✎
08:57
|
(40) можно, но не в общем виде. Будет ограничение на длину цепочки.
|
|||
43
RomanYS
06.04.17
✎
08:58
|
может я задачу не понял. Если есть еще 3я колонка с порядковые номером, то задача не сложна
1. соединением находим начала 2. нумеруем начала 3. соединяем начала и исходную таблицу |
|||
44
Naf2017
06.04.17
✎
09:00
|
(41) "длиной не более 128" и "в общем виде" это как бы не одно и тоже
|
|||
45
NorthWind
06.04.17
✎
09:07
|
(43) приведите свое решение
|
|||
46
RomanYS
06.04.17
✎
09:17
|
(45) доберусь до компа, напишу
|
|||
47
lock19
06.04.17
✎
09:27
|
"Одно и то же число присутствует только в одной цепочке и не повторяется в таблицы больше одного раза"
"1 2 2 4 4 " ??? |
|||
48
Naf2017
06.04.17
✎
09:38
|
(47) он имел ввиду в столбце
|
|||
49
RomanYS
06.04.17
✎
09:43
|
+(43)
(0) можно ли считать таблицу связей упорядоченной (пронумерованной)? Или порядок в примере только для наглядности? |
|||
50
lock19
06.04.17
✎
10:06
|
(48) Всё. Уже дошло.
|
|||
51
lock19
06.04.17
✎
10:11
|
Нужно получить данные по упорядоченности и убрать пересечения для первого столбца. Далее сопоставлять по данным порядка и величине элементов. Примерно так.
|
|||
52
Ildarovich
06.04.17
✎
12:20
|
(44) С упорством, достойным лучшего применения, хочу донести, где, по моему мнению вы не правы.
А если в запрос (37) добавить еще 93 "каскада"? - Это легко сделать прямо сейчас. Это будет статический запрос. Существенно менее длинный по размеру, чем многие запросы в ЗУП. Тогда вы тоже скажете: "длиной не более 1 000 000 000 000 000 000 000 000 000 000" и "в общем виде" это как бы не одно и тоже? Пытаюсь обратить внимание на разницу между математикой, которая имеет дело с абстракциями (конструкциями, не существующими в природе) и программированием, как инженерной дисциплиной, которая позволяет создавать реально работающие системы, построенные из конкретных объектов материального мира для отражения объектов материального мира, число которых при программировании можно считать конечным. Число атомов во Вселенной имеет оценку, выраженную числом с конкретным количеством нулей. Для которого можно посчитать число необходимых каскадов удвоения. Поэтому если исходная задача является задачей программирования, то запрос, построенный по принципу, представленному в (37), ее, на мой взгляд, решает. |
|||
53
Ildarovich
06.04.17
✎
12:25
|
(49) Давайте посчитаем ее такой.
|
|||
54
Naf2017
06.04.17
✎
12:26
|
(52) вот и бел гейтс считал, что «640 Кб должно быть достаточно для каждого»
|
|||
55
NorthWind
06.04.17
✎
12:42
|
(52) если исходить из "жизненности", то и курсор может быть неплох, и даже извлечение данных на клиент и получение результата "навигационным методом". Пока строк не сильно много - не страшно :)
|
|||
56
Ildarovich
06.04.17
✎
13:09
|
(54) По словам самого Гейтса, он этого не говорил: https://ru.wikipedia.org/wiki/640_(число).
+(53) Пока не соображу, как можно использовать упорядоченность, но было бы очень интересно. |
|||
57
RomanYS
06.04.17
✎
17:12
|
(56) (53) для упорядоченной(пронумерованной) таблицы будет работать (43) без каких-либо заморочек. Писать запрос лень. Только если Вы будете настаивать что это невозможно).
|
|||
58
ovrfox
07.04.17
✎
14:21
|
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 Работает и так |
|||
59
Вафель
07.04.17
✎
14:34
|
рекурсия чтоли?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |