QUANTIL (Transact-SQL)

Gilt für:SQL-Analyseendpunkt in Microsoft Fabric und Warehouse in Microsoft Fabric

Die QUANTILE Funktion liefert ein exaktes, kontinuierliches Quantil nicht-numerischerNULL Werte. Sie können sie sowohl als Aggregatfunktion als auch als Fensterfunktion (Analysefunktion) verwenden:

  • Aggregierte Nutzung: Gibt das angeforderte Quantil für eine ganze Gruppe zurück.
  • Fensternutzung: Gibt für jede Partition das angeforderte Quantil zurück, während die Zeilenausgabe erhalten bleibt.

Transact-SQL-Syntaxkonventionen

Syntax

Syntax der Aggregationsfunktion:

QUANTILE ( numeric_literal , numeric_expression )

Analysefunktionssyntax:

QUANTILE ( numeric_literal , numeric_expression ) OVER ( [ <partition_by_clause> ] )

Argumente

numeric_literal

Das Quantil, das berechnet werden soll. Der Wert muss im inklusiven Bereich von 0.0 bis 1.0liegen. Zum Beispiel geben 0.5 Sie an, den Median zu berechnen oder 0.95 den 95. Perzentil.

numeric_expression

Der numerische Ausdruck, dessen Quantil berechnet wird. Unterstützte exakte numerische Typen sind int, bigint, smallint, , tinyint, smallmoneynumericdecimalund money. Unterstützte approximative numerische Typen sind float und real.

OVER-Klausel

Die partition_by_clause dividiert das von der FROM Klausel erzeugte Resultset in Partitionen, und die Funktion wird auf jede Partition angewendet.

Wenn Sie partition_by_clause nicht spezifizieren, behandelt die Funktion alle Zeilen der Abfrageergebnismenge als eine einzige Partition.

Die Klausel OVER unterstützt ORDER BYnicht , ROWS, oder RANGE für QUANTILE.

Weitere Informationen finden Sie unter SELECT - OVER-Klausel (Transact-SQL).

Rückgabetypen

Gibt float(53) zurück.

Hinweise

QUANTILE berechnet ein kontinuierliches Quantil über den geordneten nicht-eingangswertenNULL . Wenn das angeforderte Quantil zwischen zwei Werten liegt, interpoliert die Funktion zwischen ihnen. Das Ergebnis ist möglicherweise kein Wert, der in den Eingabezeilen existiert.

Die aggregierte Form von QUANTILE(p, numeric_expression) ist äquivalent zu PERCENTILE_CONT(p) WITHIN GROUP (ORDER BY numeric_expression). Die analytische Form besitzt innerhalb jeder Partition äquivalente percentilkontinuierliche Semantik.

NULL Werte werden ignoriert. Wenn alle Eingabewerte sindNULL, oder wenn keine Zeilen qualifizieren, QUANTILE gibt .NULL Wenn ANSI_WARNINGS , ONerzeugt das Eliminieren NULL von Werten die standardmäßige aggregierte Warnung.

Für dieselben Nicht-EingabewerteNULL und numeric_literal liefert QUANTILE das gleiche Ergebnis.

DISTINCT wird nicht unterstützt. Zeichen-, Datum-, Uhrzeit- und Datumszeit-Ausdrücke werden nicht unterstützt.

Die Funktion QUANTILE wird nicht in SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance oder SQL Database in Fabric unterstützt.

Anwendungsfall

Verwenden QUANTILE Sie, um Quartile, Perzentile und andere exakte Verteilungsgrenzen mit prägnanter Syntax zu berechnen. Berechnen Sie zum Beispiel P90-Schadensbeträge nach Plan, P95-Service-Latenz nach Region oder Q1-, Median- und Q3-Werte für eine Geschäftskennzahl.

Examples

A. Berechnung der aggregierten Quantile

Dieses Beispiel berechnet das erste Quartil, den Median, das dritte Quartil und das 95. Perzentil.

WITH Samples AS (
    SELECT *
    FROM (VALUES
        (1), (NULL), (2), (3), (4), (5), (6), (7), (8), (13)
    ) AS v(value)
)
SELECT
    QUANTILE(0.25, value) AS Q1_25thPercentile,
    QUANTILE(0.50, value) AS Median_50thPercentile,
    QUANTILE(0.75, value) AS Q3_75thPercentile,
    QUANTILE(0.95, value) AS P95
FROM Samples;

B. Berechnen Sie für jede Gruppe ein Quantil

Dieses Beispiel berechnet den Schadensbetrag des 90. Perzentils für jeden Versicherungsplan.

WITH Claims AS (
    SELECT *
    FROM (VALUES
        ('Plan-A', 420.00),
        ('Plan-A', 500.00),
        ('Plan-A', 610.00),
        ('Plan-B', 250.00),
        ('Plan-B', 275.00),
        ('Plan-B', 310.00)
    ) AS v(plan_name, claim_amount)
)
SELECT
    plan_name,
    QUANTILE(0.90, claim_amount) AS P90ClaimAmount
FROM Claims
GROUP BY plan_name;

C. Geben Sie NULL für eine vollständig NULL-Gruppe zurück

Dieses Beispiel ergibt sich NULL , weil alle qualifizierenden Werte sind NULL.

WITH CampaignDiscounts AS (
    SELECT *
    FROM (VALUES
        (9001, NULL),
        (9001, NULL),
        (9001, NULL),
        (9002, 10.00)
    ) AS v(campaign_id, discount_percent)
)
SELECT QUANTILE(0.90, discount_percent) AS P90DiscountPercent
FROM CampaignDiscounts
WHERE campaign_id = 9001;

D. Berechnen Sie ein partitioniertes Fensterquantil

Dieses Beispiel fügt die Latenz des 95. Perzentils für jeden Dienst zu jeder Anfragezeile hinzu.

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,
    QUANTILE(0.95, latency_ms) OVER (PARTITION BY service) AS ServiceP95Latency
FROM ServiceLatency;