Function to Calculate Median in SQL Server

前端 未结 30 3145
孤独总比滥情好
孤独总比滥情好 2020-11-22 04:03

According to MSDN, Median is not available as an aggregate function in Transact-SQL. However, I would like to find out whether it is possible to create this functionality (u

30条回答
  •  萌比男神i
    2020-11-22 04:31

    Although Justin grant's solution appears solid I found that when you have a number of duplicate values within a given partition key the row numbers for the ASC duplicate values end up out of sequence so they do not properly align.

    Here is a fragment from my result:

    KEY VALUE ROWA ROWD  
    
    13  2     22   182
    13  1     6    183
    13  1     7    184
    13  1     8    185
    13  1     9    186
    13  1     10   187
    13  1     11   188
    13  1     12   189
    13  0     1    190
    13  0     2    191
    13  0     3    192
    13  0     4    193
    13  0     5    194
    

    I used Justin's code as the basis for this solution. Although not as efficient given the use of multiple derived tables it does resolve the row ordering problem I encountered. Any improvements would be welcome as I am not that experienced in T-SQL.

    SELECT PKEY, cast(AVG(VALUE)as decimal(5,2)) as MEDIANVALUE
    FROM
    (
      SELECT PKEY,VALUE,ROWA,ROWD,
      'FLAG' = (CASE WHEN ROWA IN (ROWD,ROWD-1,ROWD+1) THEN 1 ELSE 0 END)
      FROM
      (
        SELECT
        PKEY,
        cast(VALUE as decimal(5,2)) as VALUE,
        ROWA,
        ROW_NUMBER() OVER (PARTITION BY PKEY ORDER BY ROWA DESC) as ROWD 
    
        FROM
        (
          SELECT
          PKEY, 
          VALUE,
          ROW_NUMBER() OVER (PARTITION BY PKEY ORDER BY VALUE ASC,PKEY ASC ) as ROWA 
          FROM [MTEST]
        )T1
      )T2
    )T3
    WHERE FLAG = '1'
    GROUP BY PKEY
    ORDER BY PKEY
    

提交回复
热议问题