Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск корневого каталога  [new]
AlexPF
Member

Откуда:
Сообщений: 1
Здравствуйте, all!

Есть задача, помогите с идеями для алгоритма.
Таблица содержит поля: Имя пользователя, Путь к файловым ресурсам.
Для каждого пользователя путь к ресурсам может иметь несколько корневых каталогов, и эти корневые каталоги не заданы явно
.Задача в том чтобы "вычислить" из всего множества строк для пользователя только корневые каталоги или каталог.
Напрашивается перебор строк с анализом вхождения друг в друга, но как подобрать критерий определения корня не хватает фантазии.
27 мар 18, 07:42    [21288351]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневого каталога  [new]
Massa52
Member

Откуда:
Сообщений: 373
AlexPF,
Примерчик бы не помешал. Так лом фантазировать, что там за каталоги и корни.
27 мар 18, 08:54    [21288494]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневого каталога  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20207
Задача сводится к поиску общей подстроки. Формально это поиск такого N, что количество подстрок с начала значения поля для COUNT(DISTINCT LEFT(field, N)) и COUNT(DISTINCT LEFT(field, N+1)) не равны, и соответственно LEFT(field, N) и есть корень (с учётом удаления из подстроки фрагмента после последнего слэша, само собой).

Однако подобный подход требует жёсткой формулировки, как идентифицировать несколько корней. Например, если у пользователя 100 файлов в c:\temp и 100 в c:\tmp, то это можно посчитать и как 2 отдельных корня, и как 200 файлов в одном корне c:\. Так что думайте над формулировками.
27 мар 18, 09:14    [21288554]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневого каталога  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
AlexPF,

declare @tmp table (
UserID int,
Path varchar(1000));
insert into @tmp values 
(1,'c:\docs\My\'),
(1,'c:\docs\Old\'),
(1,'c:\docs\'),
(2,'c:\docs\Old\'),
(2,'c:\tmp\Old\'),
(2,'c:\temp\');

Select * From @tmp a
Where not exists (Select 1 From @tmp b Where a.UserID = b.UserID  and a.Path like b.Path+'%' and a.Path<>b.Path)
27 мар 18, 09:48    [21288652]     Ответить | Цитировать Сообщить модератору
 Re: Поиск корневого каталога  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
AlexPF,

для одного котолога MIN(LEN(путь)) :)
27 мар 18, 10:06    [21288756]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить