Ntile (transact-sql)ntile (transact-sql)

Содержание:

Quick Links

The «*» indicates the function supports the full analytic syntax, including the windowing clause.

* CLUSTER_DETAILS CLUSTER_DISTANCE CLUSTER_ID CLUSTER_PROBABILITY
CLUSTER_SET * * * *
FEATURE_DETAILS FEATURE_ID FEATURE_SET
FEATURE_VALUE *
* MATCH_RECOGNIZE *
* *
PERCENTILE_CONT PERCENTILE_DISC PREDICTION PREDICTION_COST PREDICTION_DETAILS
PREDICTION_PROBABILITY PREDICTION_SET REGR_ (Linear Regression) Functions *
* * * SUM *
* * * String Aggregation Top-N Queries

For more information see:

  • ROW_NUMBER
  • Ranking using RANK, DENSE_RANK, ROW_NUMBER
  • RANK and DENSE_RANK Analytic Functions

Hope this helps. Regards Tim…

АргументыArguments

integer_expressioninteger_expressionЭто положительное целое выражение, указывающее число групп, на которые необходимо разделить каждую секцию.Is a positive integer expression that specifies the number of groups into which each partition must be divided. integer_expression может иметь тип int или bigint.integer_expression can be of type int, or bigint.

<partition_by_clause>Делит результирующий набор, полученный с помощью предложения FROM, на секции, к которым применяется функция.Divides the result set produced by the FROM clause into partitions to which the function is applied. Синтаксис PARTITION BY см. в статье Предложение OVER (Transact-SQL).For the PARTITION BY syntax, see OVER Clause (Transact-SQL).

<order_by_clause>Определяет порядок назначения значений функции NTILE строкам секции.Determines the order in which the NTILE values are assigned to the rows in a partition. Целое значение не может представлять столбец при использовании <order_by_clause> в ранжирующей функции.An integer cannot represent a column when the <order_by_clause> is used in a ranking function.

引数Arguments

PARTITION BY value_expressionPARTITION BY value_expressionFROM 句で生成された結果セットを、ROW_NUMBER 関数が適用されるパーティションに分割します。Divides the result set produced by the FROM clause into partitions to which the ROW_NUMBER function is applied. value_expression は、結果セットをパーティションに分割するときに使用する列を指定します。value_expression specifies the column by which the result set is partitioned. を指定しない場合、関数ではクエリ結果セットのすべての行を 1 つのグループとして扱います。If is not specified, the function treats all rows of the query result set as a single group. 詳細については、を参照してください。 OVER 句 (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

order_by_clauseorder_by_clause 句は、指定したパーティション内の行に一意の を割り当てる順序を決定します。The clause determines the sequence in which the rows are assigned their unique within a specified partition. この引数は必須です。It is required. 詳細については、を参照してください。 OVER 句 (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Exemples : Azure Synapse AnalyticsAzure Synapse Analytics et Parallel Data WarehouseParallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and Parallel Data WarehouseParallel Data Warehouse

E.E. Retour du nombre de lignes pour les vendeursReturning the row number for salespeople

L’exemple suivant retourne la valeur des représentants commerciaux en fonction de leur quota de ventes assigné.The following example returns the for sales representatives based on their assigned sales quota.

Voici un jeu de résultats partiel.Here is a partial result set.

F.F. Utilisation de Using ROW_NUMBER() avec PARTITIONUsing ROW_NUMBER() with PARTITION

L’exemple suivant illustre l’utilisation de la fonction avec l’argument .The following example shows using the function with the argument. Dans ce cas, la fonction numérote les lignes dans chaque partition.This causes the function to number the rows in each partition.

Voici un jeu de résultats partiel.Here is a partial result set.

ArgomentiArguments

PARTITION BY value_expressionPARTITION BY value_expressionSuddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione ROW_NUMBER.Divides the result set produced by the FROM clause into partitions to which the ROW_NUMBER function is applied. value_expression specifica la colonna in base alla quale viene partizionato il set di risultati.value_expression specifies the column by which the result set is partitioned. Se non viene specificato, la funzione considera tutte le righe del set di risultati della query come un unico gruppo.If is not specified, the function treats all rows of the query result set as a single group. Per altre informazioni, vedere Clausola OVER — (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

order_by_clauseorder_by_clauseLa clausola determina la sequenza in base alla quale alle righe viene assegnato un valore univoco all’interno di una partizione specificata.The clause determines the sequence in which the rows are assigned their unique within a specified partition. Questo argomento è obbligatorio.It is required. Per altre informazioni, vedere Clausola OVER — (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Кейс. Модели атрибуции

Благодаря модели атрибуции можно обоснованно оценить вклад каждого канала в достижение конверсии. Давайте попробуем посчитать две разных модели атрибуции с помощью оконных функций.

У нас есть таблица с id посетителя (им может быть Client ID, номер телефона и тп.), датами и количеством посещений сайта, а также с информацией о достигнутых конверсиях.

Первый клик

В Google Analytics стандартной моделью атрибуции является последний непрямой клик. И в данном случае 100% ценности конверсии присваивается последнему каналу в цепочке взаимодействий.

Попробуем посчитать модель по первому взаимодействию, когда 100% ценности конверсии присваивается первому каналу в цепочке при помощи функции FIRST_VALUE.

SELECT 
  Date
, Client_ID
, Medium
, FIRST_VALUE(Medium) OVER(PARTITION BY Client_ID ORDER BY Date) AS 'First_Click'
, Sessions
, Conversions
FROM Orders

Рядом со столбцом «Medium» появился новый столбец «First_Click», в котором указан канал в первый раз приведший посетителя к нам на сайт и вся ценность зачтена данному каналу.

Произведем агрегацию и получим отчет.

WITH First AS (
SELECT 
  Date 
, Client_ID 
, Medium 
, FIRST_VALUE(Medium) OVER(PARTITION BY Client_ID ORDER BY Date) AS 'First_Click' 
, Sessions 
, Conversions
FROM Orders
)

SELECT
  First_Click
, SUM(Conversions) AS 'Conversions'
FROM First
GROUP BY First_Click

С учетом давности взаимодействий

В этом случае работает правило: чем ближе к конверсии находится точка взаимодействия, тем более ценной она считается. Попробуем рассчитать эту модель при помощи функции DENSE_RANK.

SELECT 
  Date
, Client_ID
, Medium
-- Присваиваем ранг в зависимости от близости к дате конверсии
, DENSE_RANK() OVER(PARTITION BY Client_ID ORDER BY Date) AS 'Ranks'
, Sessions
, Conversions
FROM Orders

Рядом со столбцом «Medium» появился новый столбец «Ranks», в котором указан ранг каждой строки в зависимости от близости к дате конверсии.

Теперь используем этот запрос для того, чтобы распределить ценность равную 1 (100%) по всем точкам на пути к конверсии.

SELECT 
  Date
, Client_ID
, Medium
-- Делим ранг определенной строки на сумму рангов по пользователю
, ROUND(CAST(DENSE_RANK() OVER(PARTITION BY Client_ID ORDER BY Date) AS FLOAT) / CAST(SUM(ranks) OVER(PARTITION BY Client_ID) AS FLOAT), 2) AS 'Time_Decay' 
, Sessions
, Conversions
FROM (
      SELECT 
      Date
    , Client_ID
    , Medium
    -- Присваиваем ранг в зависимости от близости к дате конверсии
    , DENSE_RANK() OVER(PARTITION BY Client_ID ORDER BY Date) AS 'Ranks'
    , Sessions
    , Conversions
      FROM Orders
     ) rank_table

Рядом со столбцом «Medium» появился новый столбец «Time_Decay» с распределенной ценностью.

И теперь, если сделать агрегацию, можно увидеть как распределилась ценность по каналам.

WITH Ranks AS (
SELECT 
  Date
, Client_ID
, Medium
-- Делим ранг определенной строки на сумму рангов по пользователю
, ROUND(CAST(DENSE_RANK() OVER(PARTITION BY Client_ID ORDER BY Date) AS FLOAT) / CAST(SUM(ranks) OVER(PARTITION BY Client_ID) AS FLOAT), 2) AS 'Time_Decay' 
, Sessions
, Conversions
FROM (
      SELECT 
      Date
    , Client_ID
    , Medium
  -- Присваиваем ранг в зависимости от близости к дате конверсии
    , DENSE_RANK() OVER(PARTITION BY Client_ID ORDER BY Date) AS 'Ranks'
    , Sessions
    , Conversions
      FROM Orders
     ) rank_table
)

SELECT 
  Medium
, SUM(Time_Decay) AS 'Value'
, SUM(Conversions) AS 'Conversions'
FROM Ranks
GROUP BY Medium
ORDER BY Value DESC

Из получившегося отчета видно, что самым весомым каналом является канал «cpc», а канал «cpa», который был бы исключен при применении стандартной модели атрибуции, тоже получил свою долю при распределении ценности.

Полезные ссылки:

  • SELECT — предложение OVER (Transact-SQL)
  • Как работать с оконными функциями в Google BigQuery — подробное руководство
  • Модель атрибуции на основе онлайн/офлайн данных в Google BigQuery

Роман Романчук

Digital-аналитик и иногда спортсмен. Руководитель отдела аналитики финансового маркетплейса Sravni.ru

  • Учимся применять оконные функции — 29.09.2020
  • Автоматизация отчетности при помощи SQL и Power BI — 05.04.2020
  • Зачем аналитику нужно программирование на SQL? — 22.10.2019

ArgumentosArguments

PARTITION BY value_expressionPARTITION BY value_expressionDivide o conjunto de resultados produzido pela cláusula FROM nas partições às quais a função ROW_NUMBER é aplicada.Divides the result set produced by the FROM clause into partitions to which the ROW_NUMBER function is applied. value_expression especifica a coluna pela qual o conjunto de resultados é particionado.value_expression specifies the column by which the result set is partitioned. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.If is not specified, the function treats all rows of the query result set as a single group. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

order_by_clauseorder_by_clauseA cláusula determina a sequência na qual as linhas recebem seu exclusivo em uma partição especificada.The clause determines the sequence in which the rows are assigned their unique within a specified partition. É obrigatório.It is required. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

ПримерыExamples

A.A. Простые примерыSimple examples

Приведенный ниже запрос возвращает четыре системные таблицы в алфавитном порядке.The following query returns the four system tables in alphabetic order.

Результирующий набор:Here is the result set.

namename recovery_model_descrecovery_model_desc
mastermaster ПРОСТОЙSIMPLE
modelmodel FULLFULL
msdbmsdb ПРОСТОЙSIMPLE
tempdbtempdb ПРОСТОЙSIMPLE

Чтобы добавить столбец с номерами строк перед каждой строкой, добавьте столбец с помощью функции , в данном случае с именем .To add a row number column in front of each row, add a column with the function, in this case named . Предложение необходимо переместить к предложению .You must move the clause up to the clause.

Результирующий набор:Here is the result set.

Номер строкиRow# namename recovery_model_descrecovery_model_desc
11 mastermaster ПРОСТОЙSIMPLE
22 modelmodel FULLFULL
33 msdbmsdb ПРОСТОЙSIMPLE
44 tempdbtempdb ПРОСТОЙSIMPLE

Добавление предложения для столбца приведет к тому, что нумерация начнется заново при изменении значения .Adding a clause on the column, will restart the numbering when the value changes.

Результирующий набор:Here is the result set.

Номер строкиRow# namename recovery_model_descrecovery_model_desc
11 modelmodel FULLFULL
11 mastermaster ПРОСТОЙSIMPLE
22 msdbmsdb ПРОСТОЙSIMPLE
33 tempdbtempdb ПРОСТОЙSIMPLE

Б.B. Возврат номера строки для salespeopleReturning the row number for salespeople

В следующем примере показан расчет номера строки для salespeople в Компания Adventure Works CyclesAdventure Works Cycles, выполняемый на основе ранжирования продаж за текущий год.The following example calculates a row number for the salespeople in Компания Adventure Works CyclesAdventure Works Cycles based on their year-to-date sales ranking.

Результирующий набор:Here is the result set.

В.C. Возврат подмножества строкReturning a subset of rows

В следующем примере показан расчет номеров всех строк в таблице в порядке с последующим возвращением строк с номерами от до включительно.The following example calculates row numbers for all rows in the table in the order of the and returns only rows to inclusive.

Г.D. Использование ROW_NUMBER() с PARTITIONUsing ROW_NUMBER() with PARTITION

В следующем примере аргумент используется для секционирования результирующего набора запроса по столбцу .The following example uses the argument to partition the query result set by the column . Предложение , указанное в предложении , упорядочивает строки каждой секции по столбцу .The clause specified in the clause orders the rows in each partition by the column . Предложение в инструкции упорядочивает полный результирующий набор запроса по .The clause in the statement orders the entire query result set by .

Результирующий набор:Here is the result set.

Character Functions Returning Character Values

Character functions that return character values return values of the following data types unless otherwise documented:

  • If the input argument is or , then the value returned is .

  • If the input argument is or , then the value returned is .

The length of the value returned by the function is limited by the maximum length of the data type returned.

  • For functions that return or , if the length of the return value exceeds the limit, then Oracle Database truncates it and returns the result without an error message.

  • For functions that return values, if the length of the return values exceeds the limit, then Oracle raises an error and returns no data.

The character functions that return character values are:

Datetime Functions

Datetime functions operate on date (), timestamp (, , and ), and interval ( , ) values.

Some of the datetime functions were designed for the Oracle data type (, , , , and ). If you provide a timestamp value as their argument, then Oracle Database internally converts the input type to a value and returns a value. The exceptions are the function, which returns a number, and the and functions, which do not accept timestamp or interval values at all.

The remaining datetime functions were designed to accept any of the three types of data (date, timestamp, and interval) and to return a value of one of these types.

All of the datetime functions that return current system datetime information, such as , , , and so forth, are evaluated once for each SQL statement, regardless how many times they are referenced in that statement.

The datetime functions are:

Псевдостолбец ROWID

севдостолбцами в Oracle принять называть столбцы, которые отсутствуют в таблицах в явном виде, но могут быть использованы в запросах. Наиболее употребимым и важным из них является ROWID псевдостолбец, являющийся уникальным идентификатором строки. Он не просто гарантированно уникален в рамках таблицы более того: он уникален в рамках базы данных. С физической точки зрения ROWID является своеобразной координатой записи в базе.

Необходимо отметить, что существование ROWID противоречит как минимум двум из двенадцати известных правил Кодда, описывающих требования к реляционной СУБД. Во-первых, ROWID нарушает правило номер 2, которое гласит: «К каждому элементу данных должен быть обеспечен доступ при помощи комбинации имени таблицы, первичного ключа строки и имени столбца». В данном случае ROWID не является первичным ключом, хотя ввиду его уникальности для каждой строки он может выступать в роли первичного ключа.

Во-вторых, нарушается правило Кодда номер 8: «Прикладные программы не должны зависеть от используемых способов хранения данных на носителях и методов обращения к ним». Нарушение этого правила происходит из-за того, что ROWID по своей сути является физической координатой записи, поэтому он будет изменяться в случае пересоздания таблицы, перезагрузки данных, перемещения таблицы из одного табличного пространства в другое и т.п. Однако ROWID уникален и неизменен в течение сеанса пользователя, поэтому приложение может считать его неизменным.

ROWID существенно упрощает работу с базой данных, поскольку позволяет однозначно идентифицировать любую строку таблицы, что, в частности, позволяет удалять и редактировать строки таблиц без первичного ключа. Кроме того, поиск строки по ее ROWID является самым быстрым из возможных, что положительно сказывается на быстродействии приложений, активно модифицирующих данные. Однако ROWID является специфической особенностью Oracle, а следовательно, его нельзя применять при разработке приложений, рассчитанных на работу с базами других типов.

Рассмотрим простейший пример запроса, извлекающего ROWID строк:

MySQL ROW_NUMBER() function examples

Let’s use the table from the sample database for the demonstration:

1) Assigning sequential numbers to rows

The following statement uses the function to assign a sequential number to each row from the table:

Here is the output:

2) Finding top N rows of every group

You can use the function for the queries that find the top N rows for every group, for example, top three sales employees of every sales channel, top five high-performance products of every category.

The following statement finds the top three products that have the highest inventory of every product line:

In this example,

  • First, we used the function to rank the inventory of all products in each product line by partitioning all products by product line and ordering them by quantity in stock in descending order.  As the result, each product is assigned a rank based on its quantity in stock. and the rank is reset for each product line.
  • Then, we selected only products whose rank is less than or equal to three.

The following shows the output:

3) Removing duplicate rows

You can use the to turn non-unique rows into unique rows and then delete the duplicate rows. Consider the following example.

First, create a table with some duplicate values:

Second, use the function to divide the rows into partitions by all columns. The row number will restart for each unique set of rows.

As you can see from the output, the unique rows are the ones whose the row number equals one.

Third, you can use the common table expression (CTE) to return the duplicate rows and delete statement to remove:

Notice that the MySQL does not support CTE based delete, therefore, we had to join the original table with the CTE as a workaround.

4) Pagination using  function

Because the assigns each row in the result set a unique number, you can use it for pagination.

Suppose, you need to display a list of products with 10 products per page. To get the products for the second page, you use the following query:

Here is the output:

In this tutorial, you have learned how to use the MySQL function to generate a sequential number for each row in a result set.

  • Was this tutorial helpful?

ArgumenteArguments

PARTITION BY value_expressionPARTITION BY value_expressionTeilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die ROW_NUMBER-Funktion angewendet wird.Divides the result set produced by the FROM clause into partitions to which the ROW_NUMBER function is applied. value_expression gibt die Spalte an, nach der das Resultset partitioniert wird.value_expression specifies the column by which the result set is partitioned. Wird nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe.If is not specified, the function treats all rows of the query result set as a single group. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

order_by_clauseorder_by_clauseDie -Klausel bestimmt die Reihenfolge, in der den Zeilen die eindeutige innerhalb einer angegebenen Partition zugewiesen wird.The clause determines the sequence in which the rows are assigned their unique within a specified partition. Sie ist erforderlich.It is required. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

EjemplosExamples

A.A. Ejemplos sencillosSimple examples

La siguiente consulta devuelve las cuatro tablas del sistema en orden alfabético.The following query returns the four system tables in alphabetic order.

El conjunto de resultados es el siguiente:Here is the result set.

namename recovery_model_descrecovery_model_desc
maestromaster SIMPLESIMPLE
modelmodel FULLFULL
msdbmsdb SIMPLESIMPLE
tempdbtempdb SIMPLESIMPLE

Para agregar una columna de número de fila delante de cada fila, agregue una columna con la función , en este caso denominada .To add a row number column in front of each row, add a column with the function, in this case named . Debe mover la cláusula hasta la cláusula .You must move the clause up to the clause.

El conjunto de resultados es el siguiente:Here is the result set.

Row#Row# namename recovery_model_descrecovery_model_desc
11 maestromaster SIMPLESIMPLE
22 modelmodel FULLFULL
33 msdbmsdb SIMPLESIMPLE
44 tempdbtempdb SIMPLESIMPLE

Al agregar una cláusula en la columna , se reiniciará la numeración cuando cambie el valor .Adding a clause on the column, will restart the numbering when the value changes.

El conjunto de resultados es el siguiente:Here is the result set.

Row#Row# namename recovery_model_descrecovery_model_desc
11 modelmodel FULLFULL
11 maestromaster SIMPLESIMPLE
22 msdbmsdb SIMPLESIMPLE
33 tempdbtempdb SIMPLESIMPLE

B.B. Devolver el número de fila de vendedorReturning the row number for salespeople

En el ejemplo siguiente se calcula un número de fila para los vendedores de Adventure Works CyclesAdventure Works Cycles según la categoría de ventas anuales hasta la fecha.The following example calculates a row number for the salespeople in Adventure Works CyclesAdventure Works Cycles based on their year-to-date sales ranking.

El conjunto de resultados es el siguiente:Here is the result set.

C.C. Devolver un subconjunto de filasReturning a subset of rows

En el ejemplo siguiente se calculan los números de fila para todas las filas de la tabla en el orden de y solo se devuelven las filas a inclusive.The following example calculates row numbers for all rows in the table in the order of the and returns only rows to inclusive.

D.D. Usar ROW_NUMBER() con PARTITIONUsing ROW_NUMBER() with PARTITION

En el ejemplo siguiente se usa el argumento para crear particiones del conjunto de resultados de la consulta por la columna .The following example uses the argument to partition the query result set by the column . La cláusula especificada en la cláusula ordena las filas de cada partición por la columna .The clause specified in the clause orders the rows in each partition by the column . La cláusula de la instrucción ordena todo el conjunto de resultados de la consulta por .The clause in the statement orders the entire query result set by .

El conjunto de resultados es el siguiente:Here is the result set.

ArgumentsArguments

PARTITION BY value_expressionPARTITION BY value_expressionDivise le jeu de résultats généré par la clause FROM en partitions auxquelles la fonction ROW_NUMBER est appliquée.Divides the result set produced by the FROM clause into partitions to which the ROW_NUMBER function is applied. value_expression spécifie la colonne par laquelle le jeu de résultats est partitionné.value_expression specifies the column by which the result set is partitioned. Si n’est pas spécifié, la fonction traite toutes les lignes du jeu de résultats de la requête comme un seul groupe.If is not specified, the function treats all rows of the query result set as a single group. Pour plus d’informations, consultez Clause OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

order_by_clauseorder_by_clauseLa clause détermine la séquence dans laquelle les lignes d’une partition spécifique reçoivent leur valeur unique.The clause determines the sequence in which the rows are assigned their unique within a specified partition. Elle est obligatoire.It is required. Pour plus d’informations, consultez Clause OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

SQL Server / Oracle SQL

SQL Introduction

SQL Syntax

SQL Select

SQL Insert

SQL Update

SQL Delete

SQL Joins

SQL Examples of Joins

SQL Explicit vs. Implicit Joins

SQL Group By

SQL Group By Examples

SQL Having

SQL — IN

SQL — NULLs

Functional Dependencies

Normalization

ACID Properties

SQL SubQueries

SQL — Queries With Examples

SQL Views

Insert, Update, Delete Views

SQL Join Views

SQL Inline Views

SQL — Nth Highest Salary

SQL Second Highest Salary

SQL — Difference Truncate / Delete

SQL — Difference Truncate / Drop

SQL — Difference HAVING / WHERE

SQL — Difference CAST / CONVERT

SQL — Difference NOT IN / NOT EXIST

SQL — Difference IN / EXISTS

SQL — Difference UNION / UNION ALL

SQL — Difference Nested / Correlated Subquery

SQL — REPLACE

SQL — TOP

SQL — LIKE

SQL — SELECT INTO

SQL — CREATE TABLE

SQL — CREATE TABLE (More Examples)

SQL — ALTER TABLE

SQL — Difference views / Materialized views

SQL Count

SQL Update

SQL Clustered / Non-Clustered Indexes

SQL — Delete Duplicate Records

SQL — Difference Unique/Primary Key

SQL — GETDATE()

SQL — DATEDIFF()

SQL — DATEADD()

SQL — DATEPART()

SQL — Convert()

SQL — SUM()

SQL — AVG()

SQL — MIN()

SQL — MAX()

SQL — Insert Into Select

SQL — Insert Multiple Values In Table

SQL — Referential Integrity

SQL — Not Null Constraint

SQL — Unique Constraint

SQL — Primary Key Constraint

SQL — Foreign Key Constraint

SQL — Default Constraint

SQL — Check Constraint

SQL — ROLLUP

SQL — CUBE

SQL — STUFF()

SQL — Count_Big

SQL — Binary_Checksum

SQL — Checksum_AGG

SQL — Index Include

SQL — Covered Query

SQL — Identity

SQL — sp_columns

SQL — Diff Local/Global Temporary Tables

SQL — Stored Procedure

SQL — sp_who

SQL — Session

SQL — Dynamic SQL

SQL — SQL Server Execution Plan

SQL — sp_executesql

SQL — Difference Execute/Execute()

SQL — Case Expression

SQL — XML Variable Example

SQL — Pivot

SQL — Merge

Example of SQL Merge

SQL Server — Difference Rank, Dense_Rank & Row_Number

SQL Server — PATINDEX Examples

SQL Server — COLLATE Examples

SQL Server — Difference CHAR / VARCHAR

SQL Server — Interview Questions for Testers

SQL Interview Questions

Difference GRANT / DENY / REVOKE

Subqueries in WHERE clause — Examples

How to check indexes on a table?

DATENAME examples

SQL Join Interview Questions

Example

Let’s look at some Oracle ROWNUM function examples and explore how to use the ROWNUM function in Oracle/PLSQL.

In this ROWNUM example, we have a table called customers with the following data:

CUSTOMER_ID  LAST_NAME  FIRST_NAME  FAVORITE_WEBSITE
-----------  ---------  ----------  ---------------------
       4000  Jackson    Joe         www.techonthenet.com
       5000  Smith      Jane        www.digminecraft.com
       6000  Ferguson   Samantha    www.bigactivities.com
       7000  Reynolds   Allen       www.checkyourmath.com
       8000  Anderson   Paige
       9000  Johnson    Derek       www.techonthenet.com

Now let’s demonstrate how the ROWNUM function works by selecting data from the customers table. Enter the following SQL statement in Oracle:

SELECT ROWNUM, customers.*
FROM customers
WHERE customer_id > 4500;

These are the results that you should see:

ROWNUM  CUSTOMER_ID  LAST_NAME  FIRST_NAME  FAVORITE_WEBSITE
------  -----------  ---------  ----------  ---------------------
     1         5000  Smith      Jane        www.digminecraft.com
     2         6000  Ferguson   Samantha    www.bigactivities.com
     3         7000  Reynolds   Allen       www.checkyourmath.com
     4         8000  Anderson   Paige
     5         9000  Johnson    Derek       www.techonthenet.com

In this example, the ROWNUM function returns 1 for the first record, 2 for the second record, and so on. Since this is a very simple example, it would appear that the ROWNUM function is straight-forward to use, but it is a bit more complicated than you think.

Let’s complicate the example by introducing an ORDER BY clause and sort the results by last_name in ascending order. Enter the following SELECT statement in Oracle:

SELECT ROWNUM, customers.*
FROM customers
WHERE customer_id > 4500
ORDER BY last_name;

You should see these results:

ROWNUM   CUSTOMER_ID   LAST_NAME   FIRST_NAME   FAVORITE_WEBSITE
------   -----------   ---------   ----------   ---------------------
     4          8000   Anderson    Paige
     2          6000   Ferguson    Samantha     www.bigactivities.com
     5          9000   Johnson     Derek        www.techonthenet.com
     3          7000   Reynolds    Allen        www.checkyourmath.com
     1          5000   Smith       Jane         www.digminecraft.com

You would expect that the first row in your result set would have a ROWNUM value of 1, but in this example, it has a ROWNUM value of 4. Why is this? Well, it depends how Oracle accessed the rows in the query. For example your results can vary depending on a lot of factors (ie: the order that you inserted the data in the table or if there is an index on the table).

Because of these factors, there is a right and wrong way to use the ROWNUM function.

Recommended Way to Use ROWNUM

The most reliable way to use the ROWNUM is to use a subquery to filter and sort your results and then place the ROWNUM function in the outer SELECT. Enter the following SELECT in Oracle:

SELECT ROWNUM, a.*
FROM (SELECT customers.*
      FROM customers
      WHERE customer_id > 4500
      ORDER BY last_name) a;

These are the results that you should see:

ROWNUM  CUSTOMER_ID  LAST_NAME  FIRST_NAME  FAVORITE_WEBSITE
------  -----------  ---------  ----------  ---------------------
     1         8000  Anderson   Paige
     2         6000  Ferguson   Samantha    www.bigactivities.com
     3         9000  Johnson    Derek       www.techonthenet.com
     4         7000  Reynolds   Allen       www.checkyourmath.com
     5         5000  Smith      Jane        www.digminecraft.com

By using a subquery in this way, it forces the ROWNUM to properly order the records, starting at 1 for the first record, 2 for the second and so on.

Use ROWNUM to Limit Results

The ROWNUM function is also handy if you want to limit the results of a query. For example, you could return the top 2 results. Enter the following SQL statement in Oracle:

SELECT *
FROM (SELECT customers.*
      FROM customers
      WHERE customer_id > 4500
      ORDER BY last_name)
WHERE ROWNUM < 3;

You should see these results:

CUSTOMER_ID  LAST_NAME  FIRST_NAME  FAVORITE_WEBSITE
-----------  ---------  ----------  ---------------------
       8000  Anderson   Paige
       6000  Ferguson   Samantha    www.bigactivities.com

In this example, the ROWNUM function would return the top 2 results because we want .

If we wanted to get the bottom 2 results, we could just change the sort order of the subquery to . Enter the following query in Oracle:

SELECT *
FROM (SELECT customers.*
      FROM customers
      WHERE customer_id > 4500
      ORDER BY last_name DESC)
WHERE ROWNUM < 3;

These are the results that you should see:

CUSTOMER_ID  LAST_NAME  FIRST_NAME  FAVORITE_WEBSITE
-----------  ---------  ----------  -------------------
       5000  Smith      Jane        www.digminecraft.com
       7000  Reynolds   Allen       www.checkyourmath.com

Now we get the bottom 2 results because we have sorted the last_name in descending order.

SQL ROW_NUMBER() Function Overview

The is a window function that assigns a sequential integer number to each row in the query’s result set.

The following illustrates the syntax of the function:

In this syntax,

  • First, the clause divides the result set returned from the  clause into partitions. The clause is optional. If you omit it, the whole result set is treated as a single partition.
  • Then, the clause sorts the rows in each partition. Because the is an order sensitive function, the clause is required.
  • Finally, each row in each partition is assigned a sequential integer number called a row number. The row number is reset whenever the partition boundary is crossed.

Пример WITH с функцией

Для примеров оператора WITH необходимо создать следующую тестовую таблицу.

Oracle PL/SQL

DROP TABLE t1 PURGE;

CREATE TABLE t1 AS
SELECT 1 AS id
FROM dual
CONNECT BY level <= 1000000;

— Сбор статистики на CTAS больше не требуется в 12c,
— при условии, что запрос выдается не-SYS пользователем.
— EXEC DBMS_STATS.gather_table_stats (USER, ‘t1’);

1
2
3
4
5
6
7
8
9
10

DROPTABLEt1PURGE;
 

CREATETABLEt1AS

SELECT1ASid

FROMdual

CONNECTBYlevel<=1000000;
 
— Сбор статистики на CTAS больше не требуется в 12c,
— при условии, что запрос выдается не-SYS пользователем.
— EXEC DBMS_STATS.gather_table_stats (USER, ‘t1’);

В этом операторе WITH раздел объявления может использоваться для определения функций PL/SQL, как показано ниже.

Oracle PL/SQL

WITH
FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN p_id;
END;
SELECT with_function(id)
FROM t1
WHERE rownum = 1

—результат
WITH_FUNCTION(ID)
——————
1

1
2
3
4
5
6
7
8
9
10
11
12
13

WITH

FUNCTIONwith_function(p_idINNUMBER)RETURNNUMBERIS

BEGIN

RETURNp_id;

END;

SELECTwith_function(id)

FROMt1

WHERErownum=1
 
—результат
WITH_FUNCTION(ID)
——————

1

С точки зрения разрешения имен функций, определенных в разделе объявлений PL/SQL оператора WITH, имеют приоритет над объектами с тем же именем, определенным на уровне схемы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector