2017-11-29 3 views
0

Ich frage mich, ob jemand helfen kann, ich versuche, einen Median zu berechnen, der von den Gruppierungen aus meiner Sicht bleibt.Partitioned Median

Ich mag den folgenden Code, aber es gibt mir nur den gesamten Median in jeder Zeile. Ich denke, ich brauche zu verwenden OVER (PARTITION BY()), aber ich kann einfach nicht machen Köpfe noch Schwänze es auch nach wütend Googeln und Lesen von renommierten Artikel wie diesen https://sqlperformance.com/2012/08/t-sql-queries/median

`SELECT 
YEAR(reportsubmitted) as “Year Submitted”, 
Month(reportsubmitted) as “Month Submitted”, COUNT (DISTINCT(propertyid)) as 
“Number of Reports Submitted”, SUM([report fee]) as “Total Report Fee”, 

(
(SELECT MAX([days From Audit to Submission]) 

FROM (SELECT TOP 50 PERCENT ([days From Audit to Submission]) 

FROM vwCMnAuditorsProcessLength WHERE ReportSubmitted > ‘2017-04-01’ ORDER BY 
[days From Audit to Submission]) AS x) 

(SELECT MIN([days From Audit to Submission]) 

FROM (SELECT TOP 50 PERCENT [days From Audit to Submission] 
FROM vwCMnAuditorsProcessLength WHERE ReportSubmitted > ‘2017-04-01’ ORDER BY 
[Report Fee] DESC) AS y) 
)/2.0 as “Median Days” 

FROM vwCMnAuditorsProcessLength 
WHERE reportsubmitted >= ‘2017-04-01’ 

GROUP BY MONTH(reportsubmitted), YEAR(reportsubmitted)` 

ich die unten als etwas versuchte anders, aber es scheint eine Menge Daten

SELECT 

[MMYYYY ReportSubmitted], 

[Total Report Fee], 

[Number of Reports Submitted], 

AVG([days from audit to submission]) as “Median days to Submission” 

FROM (

SELECT [MMYYYY ReportSubmitted], [report fee], propertyid, 
CAST([days from audit to submission] as decimal(5,2)) [days from audit to submission], 

ROW_NUMBER() OVER(
Partition by [MMYYYY ReportSubmitted] 
Order by [days from audit to submission] ASC) AS “RowASC”, 

ROW_NUMBER() OVER(
Partition by [MMYYYY ReportSubmitted] 
Order by [days from audit to submission] DESC) AS “RowDESC”, 

SUM([report fee]) OVER(Partition by [MMYYYY ReportSubmitted] Order by [days from 
audit to submission]) AS “Total Report Fee”, 
COUNT(propertyid) OVER(Partition by [MMYYYY ReportSubmitted] Order by [days from audit to submission]) AS “Number of Reports Submitted” 

FROM vwCMnAuditorsProcessLength) x 

WHERE RowASC in (RowDESC,RowDESC-1,RowDESC+1) 

Group by [MMYYYY ReportSubmitted], [Total Report Fee], [Number of Reports Submitted] 
Order by [MMYYYY ReportSubmitted] 

Wenn jemand irgendwelche Ideen Diskontierung werden muss, würde ich wirklich

Antwort

0

greatful sein, wenn Sie nicht über die Leistung kümmern sich dann der einfachste Weg ist der beste:

SELECT SalesPerson, Median = MAX(Median) 
FROM 
(
    SELECT SalesPerson,Median = PERCENTILE_CONT(0.5) WITHIN GROUP 
    (ORDER BY Amount) OVER (PARTITION BY SalesPerson) 
    FROM dbo.Sales 
) 
AS x 
GROUP BY SalesPerson; 

Beispiel aus: https://sqlperformance.com/2014/02/t-sql-queries/grouped-median

Wenn Sie noch einfachere Methode wollen empfehle ich CRL-Funktion: https://stackoverflow.com/a/16719240/1903793

Es Sie Median wie folgt berechnen lässt:

SELECT dbo.Median(Field) FROM Table 
+0

Hallo, Vielen Dank für die Geschwindigkeitsantwort. Die Version, die wir benutzen, hat PERCENTILE_COUNT() nicht als Funktion, also funktioniert das nicht für mich :( – Polly