Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
mysql:functions:row_number [2021/07/09 22:08] werwolf [order_definition] |
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 синтаксически выглядит следующим образом : | + | order_definition синтаксически выглядит следующим образом :<code sql> |
| - | + | ||
| - | <code> | + | |
| ORDER BY <expression> [ASC|DESC],[{,<expression>}...] | ORDER BY <expression> [ASC|DESC],[{,<expression>}...] | ||
| </code> | </code> | ||
| Строка 34: | Строка 34: | ||
| Давайте использовать таблицу products из примера базы данных для демонстрации: | Давайте использовать таблицу 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 для генерации последовательного номера для каждой строки в наборе результатов. | ||