Можем ли мы использовать аналитические функции для извлечения родителей и детей в иерархии? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть следующие данные (образец реальных данных, который намного больше):

id p_id
1  null
2  1
3  1
4  2
5  4
6  5
7  5
8  3
9  7

Можно ли использовать аналитическую функцию SQL Server, чтобы получить следующий результат (получить самый глубокийИерархия):

id p_id
1  null
2  1
4  2
5  4
7  5
9  7

Я могу использовать Recursive CTE, чтобы получить уровень каждого идентификатора, однако вместо этого я пытаюсь использовать аналитические функции.Я подозреваю, что мне нужно использовать функцию Lag или Lead, однако я новичок в аналитических функциях, поэтому, если это возможно, пожалуйста, помогите поделиться решением.Ваша помощь приветствуется!Спасибо.

1 Ответ

0 голосов
/ 03 июня 2018

Позвольте мне опубликовать это как ответ, а не как комментарий.

Нет, вы не можете использовать аналитические функции для этой цели.Аналитические функции позволяют обобщать данные об известных группах записей.Сводные данные могут быть довольно экзотическими - например, частичные суммы или вычисление процентилей или выборка предыдущей записи в группе.Однако «группа» определена статически в предложении управления окнами.

Тем не менее, возможно представить иерархические данные, так что это возможно.Идея состоит в том, чтобы включить полный путь для каждого элемента:

id parent_path
1  /1
2  /1/2
3  /1/3
4  /1/2/4
5  /1/2/4/5
6  /1/2/4/5/6
7  /1/2/4/5/7
8  /1/3/8
9  /1/2/4/5/7/9

Используя это представление, вы можете использовать оконные функции, чтобы получить все дочерние элементы "1".Тем не менее, оконные функции не нужны вообще.Работает простое выражение like: parent_path like '/1/%'.

Проблема с этой структурой данных заключается в настройке триггеров для ее поддержки (определенно возможно, просто немного работы).

...