MEDIAN (Transact-SQL)

Berlaku untuk:Titik akhir analitik SQL di Microsoft Fabric dan Warehouse di Microsoft Fabric

Fungsi ini MEDIAN mengembalikan median tepat, atau persentil ke-50, dari nilai non-numerikNULL . Anda dapat menggunakannya sebagai fungsi agregat dan fungsi jendela (analitik):

  • Penggunaan agregat: Mengembalikan median untuk seluruh grup.
  • Penggunaan jendela: Mengembalikan median untuk setiap partisi sambil mempertahankan output tingkat baris.

Konvensi sintaks Transact-SQL

Syntax

Sintaks fungsi agregasi:

MEDIAN ( numeric_expression )

Sintaks fungsi analitik:

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

Argumen

numeric_expression

Ekspresi numerik yang mediannya dihitung. Tipe numerik eksak yang didukung adalah int, bigint, smallint, tinyint, numeric, smallmoneydecimalbitdan .money Tipe numerik perkiraan yang didukung adalah float dan real.

Klausa OVER

partition_by_clause membagi tataan hasil yang dihasilkan oleh FROM klausul menjadi partisi, dan fungsi diterapkan ke setiap partisi.

Jika Anda tidak menentukan partition_by_clause, fungsi akan memperlakukan semua baris dari hasil query sebagai satu partisi tunggal.

Klausul tersebut OVER tidak mendukung ORDER BY, ROWS, atau RANGE untuk MEDIAN.

Untuk informasi selengkapnya, lihat SELECT - OVER clause (Transact-SQL).

Tipe pengembalian

Menampilkan float(53).

Komentar

MEDIAN menghitung persentil ke-50 kontinu dari nilai non-inputNULL yang diurutkan. Untuk jumlah nilai input genap, fungsi ini menginterpolasi antara dua nilai tengah. Hasilnya mungkin bukan nilai yang ada di baris input.

MEDIAN setara dengan PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY numeric_expression) untuk penggunaan agregat. Bentuk analitik memiliki semantik persentil kontinu yang setara di dalam setiap partisi.

NULL nilai diabaikan. Jika semua nilai input adalah NULL, atau jika tidak ada baris yang memenuhi syarat, MEDIAN mengembalikan NULL. Ketika ANSI_WARNINGS adalah ON, menghilangkan NULL nilai menghasilkan peringatan agregat standar.

MEDIAN tidak deterministik karena perhitungan floating-point dalam jalur eksekusi paralel dapat menghasilkan variasi kecil. Untuk informasi selengkapnya, lihat Fungsi deterministik dan nondeterministik.

DISTINCT tidak didukung. Ekspresi karakter, tanggal, waktu, dan waktu tanggal tidak didukung.

Fungsi ini MEDIAN tersedia di Fabric Data Warehouse dan endpoint analitik SQL dari item Fabric. Fungsi ini MEDIAN tidak didukung di SQL Server, Azure SQL Database, Azure SQL Managed Instance, atau database SQL di Fabric.

Skenario penggunaan

Gunakan MEDIAN ketika rata-rata bisa terdistorsi oleh nilai yang tidak biasa tinggi atau rendah. Misalnya, nilai pesanan median, waktu respons, atau jumlah klaim sering kali lebih jelas mewakili pengamatan tipikal dibandingkan rata-rata aritmatika. Formulir agregat merangkum grup, dan formulir analitik menambahkan tolok ukur partisi ke setiap baris detail.

Examples

A. Hitung median agregat

Contoh ini mengembalikan median dari delapan nilai. Karena input memiliki jumlah baris genap, MEDIAN interpolasi antara 4 dan 5.

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

Hasilnya adalah 4.5.

B. Hitung median untuk setiap grup

Contoh ini menghitung jumlah pesanan median untuk setiap wilayah penjualan.

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. Abaikan nilai NULL

Contoh ini mengabaikan NULL input dan menghitung median dari nilai yang tersisa.

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

Jika setiap nilai input adalah NULL, fungsi mengembalikan NULL.

D. Hitung median jendela yang dipartisi

Contoh ini menambahkan latensi median untuk setiap layanan ke setiap baris permintaan.

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;