MEDIÁN (Transact-SQL)

Platí pro:Koncový bod analýzy SQL v Microsoft Fabric a Warehouse v Microsoft Fabric

Funkce MEDIAN vrací přesný medián, tedy 50. percentil, nenumerickýchNULL hodnot. Můžete ji použít jako agregační funkci i funkci okna (analýzy):

  • Agregované použití: Vrátí medián pro celou skupinu.
  • Využití okna: Vrátí medián pro každou partition při zachování výstupu na úrovni řádku.

Transact-SQL konvence syntaxe

Syntaxe

Syntaxe agregační funkce:

MEDIAN ( numeric_expression )

Syntaxe analytické funkce:

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

Argumenty

numeric_expression

Číselný výraz, jehož medián je vypočítán. Podporované přesné numerické typy jsou int, bigint, smallint, tinyint, numeric, decimal, bit, , smallmoneya .money Podporované přibližné numerické typy jsou float a .real

Klauzule OVER

Partition_by_clause rozdělí sadu výsledků vytvořenou FROM klauzulí na oddíly a funkce se použije na každý oddíl.

Pokud partition_by_clause nespecifikujete, funkce považuje všechny řádky z množiny výsledků dotazu jako jednu partition.

Klauzule OVER nepodporuje ORDER BY, ROWS, ani RANGE pro MEDIAN.

Další informace naleznete v tématu SELECT - OVER klauzule (Transact-SQL).

Návratové typy

Vrátí float(53).

Remarks

MEDIAN vypočítá spojitý 50. percentil uspořádaných nevstupníchNULL hodnot. Pro sudý počet vstupních hodnot funkce interpoluje mezi dvěma prostředními hodnotami. Výsledkem nemusí být hodnota, která by existovala ve vstupních řádcích.

MEDIAN je ekvivalentní pro PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY numeric_expression) agregované použití. Analytická forma má ekvivalentní percentilově spojitou sémantiku v rámci každé části.

NULL hodnoty jsou ignorovány. Pokud jsou všechny vstupní hodnoty , NULLnebo pokud žádné řádky nesplňují podmínky, MEDIAN vrátí NULL. Když ANSI_WARNINGS je , ONodstranění NULL hodnot vytváří standardní agregované varování.

MEDIAN je nedeterministický, protože výpočty s plovoucí desetinnou čárkou v paralelních cestách mohou způsobit mírné odchylky. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

DISTINCT není podporováno. Znaky, datum, čas a datum a datum nejsou podporovány.

Funkce MEDIAN je dostupná v Fabric Data Warehouse a jako SQL analytics endpoint Fabric položek. Tato MEDIAN funkce není podporována v SQL Server, Azure SQL Database, Azure SQL Managed Instance ani v SQL databázi ve Fabric.

Případ použití

Použijte MEDIAN v případech, kdy může být průměr zkreslen neobvykle vysokými nebo nízkými hodnotami. Například medián objednávky, doba odezvy nebo výše nároku často představují typické pozorování jasněji než aritmetický průměr. Agregovaný formulář shrnuje skupiny a analytický formulář přidává benchmark rozdělení ke každému řádku detailu.

Examples

A. Vypočítejte agregovaný medián

Tento příklad vrací medián osmi hodnot. Protože vstup má sudý počet řádků, MEDIAN interpoluje mezi 4 a 5.

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

Výsledek je 4.5.

B. Vypočítejte medián pro každou skupinu

Tento příklad vypočítává medián objednávky pro každý prodejní region.

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. Ignorujte hodnoty NULL

Tento příklad ignoruje NULL vstup a vypočítá medián ze zbývajících hodnot.

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

Pokud je každá vstupní hodnota , NULLfunkce vrací NULL.

D. Vypočítejte medián rozděleného okna

Tento příklad přidává medián latence pro každou službu ke každému řádku požadavku.

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;