在sql server中查找中位数到表中的每个日期

Joh*_*ohn 6 sql t-sql sql-server median

我使用下面的查询来查找每个扇区的中位数

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

该表格式如下

    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   
Run Code Online (Sandbox Code Playgroud)

所以我得到了预期的结果如下

    Sector  Median
    A   5
    B   7
    C   6
Run Code Online (Sandbox Code Playgroud)

现在我需要更改流程,以便计算中位数,同时仅考虑到给定日期的记录.所以新的结果将是

    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) 
Run Code Online (Sandbox Code Playgroud)

所以这将是一个累积中位数.有人可以告诉我如何实现这一目标.我的表有大约230万条记录,大约有1100条记录,大约1100个日期.

如果您需要任何信息,请告诉我.

Gor*_*off 1

这使得事情变得更加困难,因为以下内容不起作用:

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

唉。您可以用于cross apply此目的:

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;
Run Code Online (Sandbox Code Playgroud)