2014-08-29 3 views
6

che uso qui di seguito query per trovare la mediana per ogni settoreFinding mediana in SQL Server fino a ogni data nella tabella

SELECT DISTINCT Sector, 
    PERCENTILE_DISC(0.5) WITHIN 
GROUP (ORDER BY Value) OVER (PARTITION BY sector) AS Median 
FROM TABLE 

Il tavolo è in seguito formato

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 
    A 2014-08-02 6 
    B 2014-08-02 5 
    C 2014-08-02 4 
    A 2014-08-03 3 
    B 2014-08-03 9 
    C 2014-08-03 6 
    A 2014-08-04 5 
    B 2014-08-04 8 
    C 2014-08-04 9 
    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 2 

in modo da ottenere l'atteso risultato, come di seguito

Sector Median 
    A 5 
    B 7 
    C 6 

ora ho bisogno di cambiare il processo in modo tale che le mediane sono calcolati mentre solo conside chiama i record fino alla data indicata. Quindi il nuovo risultato sarebbe

Sector Date Value 
    A 2014-08-01 1 
    B 2014-08-01 5 
    C 2014-08-01 7 (Only 1 record each was considered for A, B and C) 

    A 2014-08-02 3.5 
    B 2014-08-02 5 
    C 2014-08-02 5.5 (2 records each was considered for A, B and C) 

    A 2014-08-03 3 
    B 2014-08-03 5 
    C 2014-08-03 6 (3 records each was considered for A, B and C) 

    A 2014-08-04 4 
    B 2014-08-04 6.5 
    C 2014-08-04 6.5 (4 records each was considered for A, B and C) 

    A 2014-08-05 5 
    B 2014-08-05 7 
    C 2014-08-05 6 (All 5 records each was considered for A, B and C) 

Quindi questa sarà una sorta di mediana cumulativa. Qualcuno può dirmi come ottenerlo. La mia tabella ha circa 2,3 milioni di record con circa 1100 record ciascuno per circa 1100 date.

Per favore fatemi sapere se avete bisogno di informazioni.

risposta

1

Questo rende più difficile, perché il seguente non funziona:

SELECT DISTINCT Sector, Date, 
     PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Value) OVER (PARTITION BY sector ORDER BY DATE) AS Median 
FROM TABLE; 

Alas. È possibile utilizzare cross apply per questo scopo:

select t.sector, t.date, t.value, m.median 
from table t cross apply 
    (select top 1 PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY t2.Value) OVER (PARTITION BY sector ORDER BY t2.DATE) AS Median 
     from table t2 
     where t2.sector = t.sector and t2.date <= t.date 
    ) m; 
+0

Gentile Signore, grazie. Questo sembra funzionare bene nel mio set di dati di test. Ora sto correndo contro l'enorme tavolo. Speriamo che tutto vada bene. Grazie mille per il vostro aiuto. – John

2

Un altro modo è quello di creare un triangolo JOIN per ottenere tutto il valore passato per tutti i giorni e l'uso che, come i dati

;With T AS (
    SELECT t2.Sector, t2.[Date], t1.[Value] 
    FROM Table1 t1 
     LEFT JOIN Table1 t2 ON t1.Sector = t2.Sector and t1.[Date] <= t2.[Date] 
) 
SELECT DISTINCT Sector 
    , [Date] 
    , PERCENTILE_CONT(0.5) 
     WITHIN GROUP (ORDER BY [Value]) 
     OVER (PARTITION BY sector, [Date]) AS Median 
FROM T 
ORDER BY [Date], Sector; 

SQLFiddle demo

Nella query ho modificato PERCENTILE_DISC con PERCENTILE_CONT per ottenere la mediana corretta in caso di numero pari di valori, ad esempio la seconda giorno.

+0

Gentile Signore, grazie per la risposta. Ho cambiato il mio PERCENTILE_DISC in PERCENTILE_CONT – John

Problemi correlati