МЕДИАНА (Transact-SQL)

Применимо к:Конечная точка аналитики SQL в Microsoft Fabric и хранилище в Microsoft Fabric

MEDIAN Функция возвращает точную медиану, или 50-й процентиль, нечисловыхNULL значений. Ее можно использовать как агрегатную функцию, так и функцию окна (аналитика):

  • Совокупное использование: Возвращает медиану для всей группы.
  • Использование окна: Возвращает медиану для каждого раздела, сохраняя выход на уровне строки.

Соглашения о синтаксисе Transact-SQL

Syntax

Синтаксис функции агрегирования:

MEDIAN ( numeric_expression )

Синтаксис функции аналитики:

MEDIAN ( numeric_expression ) OVER ( [ <partition_by_clause> ] )

Аргументы

numeric_expression

Числовое выражение, медиана которого вычисляется. Поддерживаемые точные числовые типы — int, bigint, smallint, numericbitsmallmoneytinyintdecimalи .money Поддерживаемые приближённые числовые типы — это float и real.

Предложение OVER

Partition_by_clause делит результирующий набор, созданный FROM предложением, на секции, и функция применяется к каждой секции.

Если не указать partition_by_clause, функция рассматривает все строки набора результатов запроса как одну порцию.

Оговорка OVER не поддерживает ORDER BY, ROWS, или RANGE для MEDIAN.

Дополнительные сведения см. в предложении SELECT - OVER (Transact-SQL).

Типы возвращаемых данных

Возвращает float(53).

Замечания

MEDIAN вычисляет непрерывный 50-й процентиль упорядоченных невходныхNULL значений. Для чётного числа входных значений функция интерполирует между двумя средними значениями. Результат может не быть значением, существующим в входных строках.

MEDIAN эквивалентно PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY numeric_expression) для совокупного использования. Аналитическая форма имеет эквивалентную процентильно-непрерывную семантику внутри каждого разбиения.

NULL значения игнорируются. Если все входные значения равны NULL, или если ни одна строка не подходит, MEDIAN возвращает NULL. Когда ANSI_WARNINGS , ONустранение NULL значений даёт стандартное агрегированное предупреждение.

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

DISTINCT не поддерживается. Выражения персонажей, даты, времени и времени не поддерживаются.

Функция MEDIAN доступна в Fabric Data Warehouse и в конечной точке аналитики SQL Fabric элементов. Эта MEDIAN функция не поддерживается в SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure или SQL Database in Fabric.

Сценарий использования

Используйте MEDIAN тогда, когда среднее может искажаться необычно высокими или низкими значениями. Например, медианное значение порядка, время ответа или сумма заявления часто более чётко отражают типичное наблюдение, чем среднее арифметическое значение. Агрегатная форма суммирует группы, а аналитическая форма добавляет к каждой детализированной строке эталон разбиения.

Examples

A. Вычислите агрегированную медиану

В этом примере медиана из восьми значений. Поскольку вход содержит чётное количество строк, MEDIAN интерполирует между 4 и 5.

SELECT MEDIAN(value) AS MedianValue
FROM (VALUES (1), (2), (3), (4), (5), (6), (7), (8)) AS t(value);

Результат: 4.5.

B. Вычислите медиану для каждой группы

В этом примере рассчитывается медианная сумма заказа для каждого региона продаж.

WITH SalesOrders AS (
    SELECT *
    FROM (VALUES
        ('North', 120.00),
        ('North', 220.00),
        ('North', 320.00),
        ('South', 150.00),
        ('South', 250.00),
        ('South', 450.00)
    ) AS v(region, order_amount)
)
SELECT
    region,
    MEDIAN(order_amount) AS MedianOrderAmount
FROM SalesOrders
GROUP BY region;

C. Игнорировать значения NULL

В этом примере NULL входные данные игнорируются и вычисляются медианы из оставшихся значений.

SELECT MEDIAN(value) AS MedianValue
FROM (VALUES (1), (2), (NULL), (3), (4)) AS t(value);

Если каждое входное значение равно NULL, функция возвращает NULL.

D. Вычислите разделённую медиану окна

В этом примере медианная задержка для каждого сервиса добавляется к каждой строке запроса.

WITH ServiceLatency AS (
    SELECT *
    FROM (VALUES
        ('Checkout', 'req-001', 180),
        ('Checkout', 'req-002', 220),
        ('Checkout', 'req-003', 260),
        ('Search', 'req-010', 90),
        ('Search', 'req-011', 110),
        ('Search', 'req-012', 130)
    ) AS v(service, request_id, latency_ms)
)
SELECT
    service,
    request_id,
    latency_ms,
    MEDIAN(latency_ms) OVER (PARTITION BY service) AS ServiceMedianLatency
FROM ServiceLatency;