PERCENTILE_DISC (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsEndpoint di analisi SQL in Microsoft FabricMagazzino in Microsoft FabricDatabase SQL in Microsoft Fabric

Calcola un percentile specifico per i valori ordinati in un intero set di righe o all'interno di partizioni distinte di un set di righe in SQL Server. Per un determinato valore percentile P, PERCENTILE_DISC ordina i valori dell'espressione ORDER BY nella clausola . Restituisce quindi il valore con il valore più CUME_DIST piccolo specificato (rispetto alla stessa specifica di ordinamento) maggiore o uguale a P. Ad esempio, PERCENTILE_DISC (0.5) calcola il 50° percentile (ovvero la median) di un'espressione. PERCENTILE_DISC calcola il percentile in base a una distribuzione discreta dei valori di colonna. Restituisce un risultato uguale a un valore specifico nella colonna.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )
    OVER ( [ <partition_by_clause> ] )

Argomenti

literal

Percentile da calcolare. Il valore deve essere compreso tra 0 e 1.

ALL'INTERNO DEL GRUPPO ( ORDINE PER order_by_expression [ASC | DESC ] )

Specifica un elenco di valori in base a cui ordinare e calcolare il percentile. È consentito un solo order_by_expression. Per impostazione predefinita, l'ordinamento è crescente. L'elenco dei valori può essere di uno qualsiasi dei tipi di dati validi per l'operazione di ordinamento.

CAMBIO ( <partition_by_clause> )

Divide il FROM set di risultati della clausola in partizioni. A queste partizioni viene applicata la funzione di percentile. Per altre informazioni, vedere clausola SELECT - OVER. La <clausola ORDER BY e >la clausola<> rows o range non possono essere specificate in una PERCENTILE_DISC funzione.

Tipi restituiti

Il tipo restituito viene determinato dal tipo di order_by_expression.

Informazioni sulla compatibilità

Con il livello di compatibilità 110 e superiore, WITHIN GROUP è una parola chiave riservata. Per altre informazioni, vedere ALTER DATABASE Livello di compatibilità.

Osservazioni:

Tutti i valori Null nel set di dati vengono ignorati.

PERCENTILE_DISC è non deterministico. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.

Esempi

Esempio della sintassi di base

L'esempio seguente usa PERCENTILE_CONT e PERCENTILE_DISC per trovare lo stipendio mediano di ogni reparto. Potrebbero non restituire lo stesso valore:

  • PERCENTILE_CONT restituisce il valore appropriato, anche se non esiste nel set di dati.
  • PERCENTILE_DISC restituisce un valore set effettivo.
USE AdventureWorks2022;
SELECT DISTINCT Name AS DepartmentName,
                PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate) OVER (PARTITION BY Name) AS MedianCont,
                PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate) OVER (PARTITION BY Name) AS MedianDisc
FROM HumanResources.Department AS d
     INNER JOIN HumanResources.EmployeeDepartmentHistory AS dh
         ON dh.DepartmentID = d.DepartmentID
     INNER JOIN HumanResources.EmployeePayHistory AS ph
         ON ph.BusinessEntityID = dh.BusinessEntityID
WHERE dh.EndDate IS NULL;

Ecco un set di risultati parziale.

DepartmentName        MedianCont    MedianDisc
Document Control       16.8269      16.8269
Engineering            34.375       32.6923
Executive              54.32695     48.5577
Human Resources        17.427850    16.5865

Esempi: Azure Synapse Analytics

Esempio della sintassi di base

L'esempio seguente usa PERCENTILE_CONT e PERCENTILE_DISC per trovare lo stipendio mediano di ogni reparto. Potrebbero non restituire lo stesso valore:

  • PERCENTILE_CONT restituisce il valore appropriato, anche se non esiste nel set di dati.
  • PERCENTILE_DISC restituisce un valore set effettivo.
-- Uses AdventureWorks
SELECT DISTINCT DepartmentName,
                PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BaseRate) OVER (PARTITION BY DepartmentName) AS MedianCont,
                PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY BaseRate) OVER (PARTITION BY DepartmentName) AS MedianDisc
FROM dbo.DimEmployee;

Ecco un set di risultati parziale.

DepartmentName        MedianCont    MedianDisc
--------------------   ----------   ----------
Document Control       16.826900    16.8269
Engineering            34.375000    32.6923
Human Resources        17.427850    16.5865
Shipping and Receiving  9.250000     9.0000