Ecto.Query.WindowAPI
Исходный кодПеречисляет все оконные функции.
Оконные функции всегда должны использоваться в качестве первого аргумента over/2, где второй аргумент — имя окна:
from e in Employee,
select: {e.depname, e.empno, e.salary, over(avg(e.salary), :department)},
windows: [department: [partition_by: e.depname]]
В приведённом выше примере мы получаем среднюю зарплату по каждому отделу. :department — это имя окна, в котором данные разбиты по e.depname, а avg/1 — оконная функция.
Однако определять окно необязательно, поскольку его определение можно передать вторым аргументом в over:
from e in Employee,
select: {e.depname, e.empno, e.salary, over(avg(e.salary), partition_by: e.depname)}
Оба запроса эквивалентны. Однако, если вы многократно используете одно и то же разбиение на разделы, определение окна позволит сократить запрос. См. Ecto.Query.windows/3, где перечислены все возможные выражения окна, такие как :partition_by и :order_by.
Обзор
- avg(value)
Вычисляет среднее значение для заданной записи.
- count()
Подсчитывает количество записей в таблице.
- count(value)
Подсчитывает количество заданных записей.
- cume_dist()
Возвращает относительный ранг текущей строки: (количество предшествующих текущей строк или равных ей) / (общее количество строк).
- dense_rank()
Возвращает ранг текущей строки без пропусков; эта функция подсчитывает группы равных строк.
- filter(value, filter)
Применяет заданное выражение в качестве предложения FILTER к агрегатной функции. В настоящее время поддерживается только в Postgres.
- first_value(value)
Возвращает значение, вычисленное для строки, которая является первой строкой рамки окна.
- lag(value, offset \\ 1, default \\ nil)
Возвращает значение, вычисленное для строки, расположенной на заданное количество строк перед текущей строкой в пределах раздела.
- last_value(value)
Возвращает значение, вычисленное для строки, которая является последней строкой рамки окна.
- lead(value, offset \\ 1, default \\ nil)
Возвращает значение, вычисленное для строки, расположенной на заданное количество строк после текущей строки в пределах раздела.
- max(value)
Вычисляет максимальное значение для заданной записи.
- min(value)
Вычисляет минимальное значение для заданной записи.
- nth_value(value, nth)
Возвращает значение, вычисленное для n-й строки рамки окна (отсчёт начинается с 1);
nil, если такой строки нет.- ntile(num_buckets)
Возвращает целое число от 1 до значения аргумента, разбивая раздел на максимально равные части.
- over(window_function, window_name)
Определяет значение на основе функции и окна. Дополнительные сведения см. в документации модуля.
- percent_rank()
Возвращает относительный ранг текущей строки: (ранг - 1) / (общее количество строк - 1).
- rank()
Возвращает ранг текущей строки с пропусками; то же значение, что и
row_number/0для первой равной ей строки.- row_number()
Возвращает порядковый номер текущей строки в её разделе, начиная с 1.
- sum(value)
Вычисляет сумму для заданной записи.
Функции
Функции
avg(value)Исходный код
Вычисляет среднее значение для заданной записи.
from p in Payment, select: avg(p.value)
count()Исходный код
Подсчитывает количество записей в таблице.
from p in Post, select: count()
count(value)Исходный код
Подсчитывает количество заданных записей.
from p in Post, select: count(p.id)
cume_dist()Исходный код
Возвращает относительный ранг текущей строки: (количество предшествующих текущей строк или равных ей) / (общее количество строк).
from p in Post,
select: cume_dist() |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
dense_rank()Исходный код
Возвращает ранг текущей строки без пропусков; эта функция подсчитывает группы равных строк.
from p in Post,
select: dense_rank() |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
filter(value, filter)Исходный код
Применяет заданное выражение в качестве предложения FILTER к агрегатной функции. В настоящее время поддерживается только в Postgres.
from p in Post,
select: avg(p.value)
|> filter(p.value > 0 and p.value < 100)
|> over(partition_by: p.category_id, order_by: p.date) first_value(value)Исходный код
Возвращает значение, вычисленное для строки, которая является первой строкой рамки окна.
from p in Post,
select: first_value(p.id) |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
lag(value, offset \\ 1, default \\ nil)Исходный код
Возвращает значение, вычисленное для строки, расположенной на заданное количество строк перед текущей строкой в пределах раздела.
Если такой строки нет, возвращает значение по умолчанию (которое должно иметь тот же тип, что и value). Значения offset и default вычисляются относительно текущей строки. Если они не указаны, offset по умолчанию равен 1, а default — nil.
from e in Events,
windows: [w: [partition_by: e.name, order_by: e.tick]],
select: {
e.tick,
e.action,
e.name,
lag(e.action) |> over(:w), # previous_action
lead(e.action) |> over(:w) # next_action
}
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
last_value(value)Исходный код
Возвращает значение, вычисленное для строки, которая является последней строкой рамки окна.
from p in Post,
select: last_value(p.id) |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
lead(value, offset \\ 1, default \\ nil)Исходный код
Возвращает значение, вычисленное для строки, расположенной на заданное количество строк после текущей строки в пределах раздела.
Если такой строки нет, возвращает значение по умолчанию (которое должно иметь тот же тип, что и value). Значения offset и default вычисляются относительно текущей строки. Если они не указаны, offset по умолчанию равен 1, а default — nil.
from e in Events,
windows: [w: [partition_by: e.name, order_by: e.tick]],
select: {
e.tick,
e.action,
e.name,
lag(e.action) |> over(:w), # previous_action
lead(e.action) |> over(:w) # next_action
}
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
max(value)Исходный код
Вычисляет максимальное значение для заданной записи.
from p in Payment, select: max(p.value)
min(value)Исходный код
Вычисляет минимальное значение для заданной записи.
from p in Payment, select: min(p.value)
nth_value(value, nth)Исходный код
Возвращает значение, вычисленное для n-й строки рамки окна (отсчёт начинается с 1); nil, если такой строки нет.
from p in Post,
select: nth_value(p.id, 4) |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
ntile(num_buckets)Исходный код
Возвращает целое число от 1 до значения аргумента, разбивая раздел на максимально равные части.
from p in Post,
select: ntile(10) |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
over(window_function, window_name)Исходный код
Определяет значение на основе функции и окна. Дополнительные сведения см. в документации модуля.
from e in Employee, select: over(avg(e.salary), partition_by: e.depname)
percent_rank()Исходный код
Возвращает относительный ранг текущей строки: (ранг - 1) / (общее количество строк - 1).
from p in Post,
select: percent_rank() |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
rank()Исходный код
Возвращает ранг текущей строки с пропусками; то же значение, что и row_number/0 для первой равной ей строки.
from p in Post,
select: rank() |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
row_number()Исходный код
Возвращает порядковый номер текущей строки в её разделе, начиная с 1.
from p in Post,
select: row_number() |> over(partition_by: p.category_id, order_by: p.date)
Обратите внимание: эту функцию необходимо вызывать с использованием синтаксиса оконных функций.
sum(value)Исходный код
Вычисляет сумму для заданной записи.
from p in Payment, select: sum(p.value)
© 2014 Chris McCord
Licensed under the MIT License.
https://ecto.hexdocs.pm/Ecto.Query.WindowAPI.html