APPROX_MEDIAN (Transact-SQL)

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

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

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

Konvensi sintaks Transact-SQL

Syntax

Sintaks fungsi agregasi:

APPROX_MEDIAN ( numeric_expression )

Sintaks fungsi analitik:

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

Argumen

numeric_expression

Ekspresi numerik yang median perkiraannya dihitung. Tipe numerik eksak yang didukung adalah int, bigint, smallint, tinyint, numeric, decimalsmallmoneydan 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 APPROX_MEDIAN.

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

Tipe pengembalian

Menampilkan float(53).

Komentar

APPROX_MEDIAN memperkirakan persentil ke-50 kontinu dari nilai non-inputNULL yang diurutkan. Gunakan MEDIAN jika Anda membutuhkan hasil yang tepat.

Hasil perkiraan dapat sedikit berbeda dari hasil eksaksional MEDIAN dan dapat bervariasi antar eksekusi karena rencana eksekusi dan jalur penggabungan paralel. APPROX_MEDIAN bersifat nondeterministik. Untuk informasi selengkapnya, lihat Fungsi deterministik dan nondeterministik.

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

APPROX_MEDIAN dimaksudkan untuk mengurangi latensi dan penggunaan memori dibandingkan dengan perhitungan tepat MEDIAN pada dataset besar.

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

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

Skenario penggunaan

Gunakan APPROX_MEDIAN untuk dasbor skala besar, analisis eksploratif, dan pelaporan kelompok di mana estimasi yang dekat sudah cukup dan kinerja query lebih penting daripada median pasti. Contoh umum termasuk nilai pesanan median perkiraan, latensi layanan, dan pengukuran telemetri.

Examples

A. Hitung median perkiraan agregat

Contoh ini memperkirakan median dari delapan nilai.

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

Hasilnya mendekati median persis dari 4.5, tetapi dapat sedikit bervariasi.

B. Hitung median perkiraan untuk setiap grup

Contoh ini memperkirakan 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,
    APPROX_MEDIAN(order_amount) AS ApproxMedianOrderAmount
FROM SalesOrders
GROUP BY region;

C. Abaikan nilai NULL

Contoh ini mengabaikan NULL nilai saat memperkirakan median.

SELECT APPROX_MEDIAN(value) AS ApproxMedianValue
FROM (VALUES (1), (2), (NULL), (3), (4)) AS t(value);

Jika setiap nilai input adalah NULL, fungsi mengembalikan NULL.

D. Hitung median perkiraan jendela yang dipartisi

Contoh ini menambahkan perkiraan median latensi 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,
    APPROX_MEDIAN(latency_ms) OVER (PARTITION BY service) AS ServiceApproxMedianLatency
FROM ServiceLatency;