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 для повторного дублирования записей.