Инструменты пользователя

Инструменты сайта


mysql:functions:row_number

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
mysql:functions:row_number [2021/07/09 22:07]
werwolf создано
mysql:functions:row_number [2023/01/12 12:18] (текущий)
Строка 7: Строка 7:
 Ниже показан синтаксис функции ROW_NUMBER():​ Ниже показан синтаксис функции ROW_NUMBER():​
  
-<​code>​ROW_NUMBER() OVER (<​partition_definition>​ <​order_definition>​)+<​code ​sql> 
 +ROW_NUMBER() OVER (<​partition_definition>​ <​order_definition>​)
 </​code>​ </​code>​
  
Строка 14: Строка 15:
 partition_definition имеет следующий синтаксис:​ partition_definition имеет следующий синтаксис:​
  
-<​code>​PARTITION BY <​expression>,​[{,<​expression>​}...]+<​code>​ 
 +PARTITION BY <​expression>,​[{,<​expression>​}...]
 </​code>​ </​code>​
  
Строка 23: Строка 25:
 ==== order_definition ==== ==== order_definition ====
  
-order_definition синтаксически выглядит следующим образом :<​code>​ORDER BY <​expression>​ [ASC|DESC],​[{,<​expression>​}...]+order_definition синтаксически выглядит следующим образом :<​code ​sql> 
 +ORDER BY <​expression>​ [ASC|DESC],​[{,<​expression>​}...]
 </​code>​ </​code>​
  
 Цель ORDER BY – установить порядок строк. Предложение ORDER BY не зависит от запроса ORDER BY. Цель ORDER BY – установить порядок строк. Предложение ORDER BY не зависит от запроса ORDER BY.
 +
 +===== Примеры функции ROW_NUMBER() MySQL =====
 +
 +Давайте использовать таблицу products из примера базы данных для демонстрации:​
 +
 +{{ :​mysql:​functions:​funktsiya-row_number-v-mysql.jpg?​nolink |}}
 +
 +==== 1) Присвоение последовательных номеров строкам ====
 +
 +Следующий оператор использует функцию ROW_NUMBER() для назначения последовательного номера каждой строке таблицы products:
 +<code sql>
 +SELECT
 +ROW_NUMBER() OVER (
 +ORDER BY productName
 +) row_num,
 +productName,​
 +msrp
 +FROM
 +products
 +ORDER BY
 +productName;​
 +</​code>​
 +
 +==== 2) Нахождение верхних N строк каждой группы ====
 +
 +Вы можете использовать функцию ROW_NUMBER() для запросов,​ которые находят первые N строк для каждой группы,​ например,​ три лучших сотрудника по продажам каждого канала продаж,​ пять лучших высокопроизводительных продуктов каждой категории.
 +
 +Следующее утверждение находит три лучших продукта,​ которые имеют самый высокий запас в каждой товарной линейке:​
 +
 +<code sql>
 +WITH inventory
 +AS (SELECT
 +productLine,​
 +productName,​
 +quantityInStock,​
 +ROW_NUMBER() OVER (
 +PARTITION BYproductLine
 +ORDER BY quantityInStock DESC) row_num
 +FROM
 +products
 +)
 +SELECT
 +productLine,​
 +productName,​
 +quantityInStock
 +FROM
 +inventory
 +WHERE
 +row_num <= 3;
 +</​code>​
 +
 +В этом примере
 +
 +  * Во-первых,​ мы использовали функцию ROW_NUMER() для ранжирования запасов всех продуктов в каждой продуктовой линейке путем разделения всех продуктов по продуктовой линейке и упорядочения их по количеству на складе в порядке убывания. В результате каждому продукту присваивается ранг в зависимости от его количества на складе. и ранг сбрасывается для каждой продуктовой линейки.
 +  * Затем мы выбрали только продукты,​ чей ранг меньше или равен трем.
 +
 +==== 3) Удаление повторяющихся строк ====
 +
 +Вы можете использовать,​ ROW_NUMBER() чтобы превратить неуникальные строки в уникальные строки,​ а затем удалить дублирующиеся строки . Рассмотрим следующий пример.
 +
 +Сначала создайте таблицу с некоторыми повторяющимися значениями:​
 +
 +<code sql>
 +CREATE TABLE t (
 +id INT,
 +name VARCHAR(10) NOT NULL
 +);
 +
 +INSERT INTOt(id,​name)
 +VALUES(1,'​A'​),​
 +(2,'​B'​),​
 +(2,'​B'​),​
 +(3,'​C'​),​
 +(3,'​C'​),​
 +(3,'​C'​),​
 +(4,'​D'​);​
 +</​code>​
 +
 +Во-вторых,​ используйте функцию ROW_NUMBER() для разделения строк на разделы по всем столбцам. Номер строки будет перезапущен для каждого уникального набора строк.
 +
 +<​code>​
 +SELECT
 +id,
 +name,
 +ROW_NUMBER() OVER (PARTITION BY id, name ORDER BY id) AS row_num
 +FROM t;
 +</​code>​
 +
 +{{ :​mysql:​functions:​funktsiya-row_number-v-mysql_3.jpg?​nolink |}}
 +
 +Как видно из вывода,​ уникальные строки – это те, чей номер строки равен единице.
 +
 +В-третьих,​ вы можете использовать общее табличное выражение (CTE) для возврата дублирующихся строк и удалить оператор для удаления:​
 +
 +<code sql>
 +WITH dups AS (SELECT
 +id,
 +name,
 +ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id) AS row_num
 +FROM t)
 +
 +DELETE FROM t USING t JOIN dups ON t.id = dups.id
 +WHERE dups.row_num <> 1;
 +</​code>​
 +
 +Обратите внимание,​ что MySQL не поддерживает удаление на основе CTE, поэтому нам пришлось объединить исходную таблицу с CTE в качестве обходного пути.
 +
 +==== 4) нумерация страниц с использованием функции ROW_NUMBER() ====
 +
 +Поскольку ROW_NUMBER() присваивает каждой строке в наборе результатов уникальный номер, вы можете использовать его для нумерации страниц.
 +
 +Предположим,​ вам нужно отобразить список продуктов с 10 продуктами на странице. Чтобы получить товары для второй страницы,​ вы используете следующий запрос:​
 +
 +<code sql>
 +SELECT *
 +FROM
 +(SELECT productName,​
 +msrp,
 +row_number()
 +OVER (order by msrp) AS row_num
 +FROM products) t
 +WHERE row_num BETWEEN 11 AND 20;
 +</​code>​
 +
 +Из этой статьи вы узнали,​ как использовать функцию ROW_NUMBER() в MySQL для генерации последовательного номера для каждой строки в наборе результатов.
  
  
mysql/functions/row_number.1625857632.txt.gz · Последние изменения: 2023/01/12 12:15 (внешнее изменение)