#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