Как изменить порядок с помощью connect by prior

#sql #oracle #connect-by

#sql #Oracle #connect-by

Вопрос:

У меня есть данные, подобные приведенным ниже:

  ID          DATA          S_LEVEL 
1304819     M02-004           1
1304819     M01-003           2
1304819     M01-005           3
1304819     MT-M01-005        4
1304819     M01-004           5
1304819     M01-002           6
1304819     M01-009           7
1304819     M01-020           8
1304819     MT-3100-007A      9
  

Я хочу вывод, подобный приведенному ниже, используя connect by prior и level:

  ID          DATA        S_LEVEL     D_LEVEL
1304819     M02-004         1           9
1304819     M01-003         2           8
1304819     M01-005         3           7
1304819     MT-M01-005      4           6
1304819     M01-004         5           5
1304819     M01-002         6           4
1304819     M01-009         7           3
1304819     M01-020         8           2
1304819     MT-3100-007A    9           1
  

Ответ №1:

используйте row_number() для D_level сгенерируйте и примените порядок по

 SELECT A.*, ROW_NUMBER () OVER (PARTITION BY PARTID ORDER BY MAX (S_LEVEL) DESC) AS D_LEVEL
  FROM (SELECT PARTID, DATA, S_LEVEL FROM TABLE 
       ) 
  GROUP BY PARTID,DATA,S_LEVEL ORDER BY PARTID,S_LEVEL,D_LEVEL DESC
  

Комментарии:

1. это работает, если у меня есть только один уникальный идентификатор. Но для нескольких идентификаторов приведенный выше запрос не работает.

2. Приведенный ниже запрос сработал. ВЫБЕРИТЕ A.*, ROW_NUMBER () ПОВЕРХ (РАЗДЕЛЕНИЕ По ПОРЯДКУ PARTID ПО MAX (S_LEVEL) DESC) В КАЧЕСТВЕ D_LEVEL ИЗ (ВЫБЕРИТЕ PARTID, ДАННЫЕ, S_LEVEL Из ТАБЛИЦЫ) ГРУППИРОВАТЬ ПО PARTID, ДАННЫЕ, S_LEVEL УПОРЯДОЧИВАТЬ ПО PARTID, S_LEVEL, D_LEVEL DESC