Oracle row number: Oracle ROW_NUMBER Function by Practical Examples

номер строки — оракул ROW_NUMBER()

спросил

Изменено
1 год, 5 месяцев назад

Просмотрено
150 раз

Я хотел бы написать запрос для отображения таких результатов

column0 столбец1 столбец2 столбец3
и х 1 1
и г 1 2
и г 1 3
б х 2 1
б г 2 2
с х 3 1
с г 3 2
с г 3 3

столбец 2 -> номер строки столбца 0

столбец 3 -> номер строки раздела столбец 0 и столбец 1

Я пробовал это, но не работает
ROW_NUMBER() OVER (РАЗДЕЛЕНИЕ ПО столбцу0, столбец1 ORDER BY столбец0, столбец1) столбец3
ОТ ДВОЙНОГО

есть идеи?

  • oracle
  • номер строки

Использовать DENSE_RANK для столбца2 и ROW_NUMBER для столбца3 : : :
столбец0,
столбец1,
DENSE_RANK() OVER (ORDER BY column0) AS column3,
ROW_NUMBER() OVER (PARTITION BY column0 ORDER BY column1) AS column4
ИЗ вашей таблицы;

1

С row_number:

 SQL> с проверкой (col0, col1) как
  2 (выберите 'a', 'x' из двойного объединения всех
  3 выберите «а», «у» из двойного союза всех
  4 выберите 'a', 'z' из двойного союза всех
  5 выберите 'b', 'x' из двойного союза всех
  6 выберите «b», «y» из двойного
  7 )
  8 выберите col0, col1,
  9 row_number() over (раздел по col1, порядок по col0) col2,
 10 row_number() over (раздел по col0 в порядке col1) col3
 11 из теста
 12 порядок по col0, col1
 13 /
ЦВЕТ 0 ЦВ 1 ЦВ 2 ЦВ 3
----- ------ ---------- ----------
х 1 1
а у 1 2
а я 1 3
б х 2 1
б у 2 2
SQL>
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Oracle SQL и PL/SQL: ROW_NUMBER()

ROW_NUMBER()

ROW_NUMBER()

Функция ROW_NUMBER возвращает номер строки в результирующем наборе, начиная с 1 для первой строки.

Синтаксис ROW_NUMBER()

Row_NUMBER() OVER ([partition_by_clause] order_by_clause)

partition_by_clause делит набор результатов на группы, к которым применяется функция ROW_NUMBER(). Функция применяется к каждому разделу отдельно; вычисления перезапускаются для каждого раздела.

order_by_clause указывает порядок, в котором назначаются последовательные значения ROW_NUMBER().

[Источник: Программирование SQL Server 2005 Билла Гамильтона]

Пример ROW_NUMBER()

Создадим таблицу и вставим в нее данные.

СОЗДАТЬ ТАБЛИЦУ Match_IPL
(
  Player_ID INT IDENTITY(1,1) NOT NULL,
  имя_игрока varchar(30),
  Команда варчар(30)
)
 Вставить в значения Match_IPL («Сачин», «Мумбаи»)
 Вставить в значения Match_IPL («Махендер», «Ченнаи»)
 Вставить в значения Match_IPL('Юврадж', 'Пенджаб')
 Вставить в значения Match_IPL('Nehra', 'Chennai')
 Вставить в значения Match_IPL («Бхаджи», «Мумбаи»)
 Вставить в значения Match_IPL('Рики', 'Мумбаи')
 Вставить в значения Match_IPL('Patel', 'Punjab')
 

Выберите * из Match_IPL

Player_ID Player_Name Команда
1 Сачин Мумбаи
2 Махендер Ченнаи
3 Юврадж Пенджаб
4 Нехра Ченнаи
5 Бхаджи Мумбаи
6 Рики Мумбаи
7 Патель Пенджаб

Давайте напишем запрос, используя ROW_NUMBER():

ВЫБРАТЬ  *,
  ROW_NUMBER() OVER (ORDER BY Player_Name DESC) КАК RN,
  ROW_NUMBER() OVER (РАЗДЕЛЕНИЕ ПО КОМАНДЕ ORDER BY Player_Name DESC) КАК RNP
ОТ Match_IPL
ЗАКАЗАТЬ ПО Player_Name DESC
 

Player_ID Player_Name Команда РН РНП
3 Юврадж Пенджаб 1 1
1 Сачин Мумбаи 2 1
6 Рики Мумбаи 3 2
7 Патель Пенджаб 4 2
4 Нехра Ченнаи 5 1
2 Махендер Ченнаи 6 2
5 Бхаджи Мумбаи 7 3

Выше порядковые номера присвоены каждому разделу в результирующем наборе. Набор результатов упорядочен по Player_Name в порядке убывания. Значения в столбце RN просто основаны на сортировке Player_Name, но значения в столбце RNP сначала группируются (разделяются) по Team, а затем нумеруются по Player_Name, при этом номер строки сбрасывается при изменении Team.

MSDN говорит
Нет никакой гарантии, что строки, возвращаемые запросом с использованием ROW_NUMBER(), будут упорядочены точно так же при каждом выполнении, если только не выполняются следующие условия.

а. Значения секционированного столбца уникальны.
б. Значения столбцов ORDER BY уникальны.
с. Комбинации значений столбца раздела и столбцов ORDER BY уникальны.

ROW_NUMBER() не является детерминированным.

В соответствии с «Начало SQL Server 2012 для разработчиков от Робина Дьюсона», функции ранжирования, такие как ROW_NUMBER, можно использовать только с операторами SELECT и ORDER BY. К сожалению, их нельзя использовать непосредственно в предложении WHERE OR GROUP BY, но вы можете использовать их в CTE или производной таблице.

Преимущества ROW_NUMBER
1. ROW_NUMBER позволяет вашему коду гарантировать восходящую последовательность чисел, чтобы присвоить каждой строке уникальный номер. До сих пор не было возможности гарантировать
последовательность чисел, хотя столбец на основе IDENTITY потенциально может дать последовательность, обеспечивающую успешное выполнение всех операций INSERT и отсутствие операций DELETE.
Эта функция идеальна для того, чтобы придать выходным данным ориентир, например: «Пожалуйста, взгляните на строку 10, и вы увидите…».

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

[Источник: Начало SQL Server 2012 для разработчиков, Робин Дьюсон]

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