Глубину пути можно посчитать с помощью:
len(path) - len(replace(path,'/',''))
Тогда у детей будет на одну глубину больше, чем у их родителей, и путь детей начинается с родительского пути:
on children.depth = parents.depth + 1
and substring(children.path, 1, len(parents.path)) = parents.path
Собирая это вместе (для SQL Server, но должно работать на Postgres с небольшими изменениями):
;with depth as
(
select depth = case when path = '/' then 0
else len(path) - len(replace(path,'/',''))
end
, path
from YourTable
)
select COUNT(children.path) as child_count
, parents.path
from depth parents
left join
depth children
on children.depth = parents.depth + 1
and substring(children.path, 1, len(parents.path)) = parents.path
group by
parents.path
Это печатает:
child_count path
----------- --------------------
2 /
2 /a
0 /a/a
1 /a/b
0 /a/b/c
0 /b
Тестовые данные:
if OBJECT_ID('YourTable') is not null
drop table YourTable
create table YourTable (child_count int, path varchar(max))
insert YourTable (path) values
('/'),
('/a'),
('/a/a'),
('/a/b'),
('/a/b/c'),
('/b')