Как определить количество родителей в SQL - PullRequest
0 голосов
/ 28 мая 2018

Любая помощь, которую вы можете оказать, была бы удивительной.

У меня есть запрос, который принимает три значения: порядок сортировки, уровень и количество

Мне нужен четвертый столбец, который показываетколичество родительского уровня.Поэтому, если уровень равен «3», мне нужно количество родительского элемента выше уровня «2».Уровни могут различаться, поэтому это сложно.

Ниже приведен оператор SQL для базы данных Oracle, и изображение показывает ожидаемые результаты, если четвертый столбец был для родительского количества:

select end_part_id, sort_order, level, comp_qty
from report_table
order by sort_order

Sample Table

Ответы [ 4 ]

0 голосов
/ 29 мая 2018

Это было последнее утверждение, которое заставило его работать.Еще раз спасибо за вашу помощь!

(select end_part_id, sort_order, indented_lvl, comp_qty,
(select distinct first_value(i.comp_qty) over(order by i.sort_order desc,
TRIM(i.indented_lvl) desc)
from report_table i
where i.end_part_id = x.end_part_id
and i.sort_order < x.sort_order
and TRIM(i.level) < TRIM(x.level)) as "PARENT_QTY"
from report_table x
where x.end_part_id = 'XX')
0 голосов
/ 28 мая 2018

Вот решение, оно немного сложное, но дает желаемый результат:

SQL:

select sort_order,lvl,comp_qty,
    (select distinct first_value(comp_qty) over(order by sort_order desc,lvl desc)
    from report_table
    where sort_order <x.sort_order
    and lvl<x.lvl) PARENT_QTY
from report_table x

DEMO

0 голосов
/ 28 мая 2018

Вы получаете количество паранта, просматривая последнее значение в записях с меньшим sort_order и меньшим Level:

select sort_order, level, comp_qty,
  (
    select max(comp_qty) keep (dense_rank last order by sort_order)
    from report_table parent_record
    where parent_record.sort_order < report_table.sort_order
      and parent_record.level      < report_table.level
  ) as parent_qty
from report_table
order by sort_order;
0 голосов
/ 28 мая 2018

Немного сложно предоставить решение без каких-либо тестовых данных (и я не собираюсь генерировать их самостоятельно), но я предполагаю, что это выражение должно работать:

COUNT(*) OVER (PARTITION BY COMP_QTY ORDER BY "LEVEL" RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

Примечание, RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWпо умолчанию, так что вы можете пропустить его.Я поставил это только для ясности.LEVEL - зарезервированное слово для иерархических запросов, поэтому вам следует использовать другое псевдоним / имя столбца или заключить его в кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...