blackhawk_yps你好,中位数指的是一列数按照从小到大排列,然后取中间的那个(如果数列个数是奇数,取中间的,如果是偶数,取中间两个的平均数)。

解决方案 »

  1.   

    weixy,你误解了我的意思,我需要一个求中位数的函数median(),大概这样调用
    select median(colname) from tblname
      

  2.   

    jameszht(湖泊) 兄所言甚是,确实需要自编,不过如果编出来,就有通用性了,
    原来以为简单,但现在想想好像没有那么简单。
    不只哪位高手能否帮忙?
      

  3.   


    你用的是MS SQL Server2000否?
      

  4.   

    單表還好說
    如果是多表就更複雜了
    關注&學習
      

  5.   

    我考虑过,在程序中,如果给出了一个排好序的记录集,当然比较简单,没什么说的。
    不过在sql中编函数的确不容易,我没有这方面的经验,湖泊兄说单表好说,是不是有方法,不妨说说。
      

  6.   

    MS SQL Server2000中.如果是單表,寫一個函數即可.
    函數傳入表名和字段名甚至where條件.如果是多表,那麼無法寫一個通用的函數.
      

  7.   

    我不太同意铁诺兄的说法,现在如果要写中位数的sql函数,有两种方法,一种是写一个类似于avg()一样的函数,可以应用到字段上,这个不容易。
    第二种方法,如果参数是语句,那与单表或者多表又有什么关系?
      

  8.   

    對於單表,初步想法--拋磚引玉
    declare @num as int
    set @num=(select count(*) from table)
    if @num %2 =0 
      exec('select average(colname) from (select top 2 colname from (select top +' (@num+1)/2 +' colname from table order by colname desc)))')
    else
       exec('select top 1 colname from (select top +' (@num+1)/2 +' colname from table order by colname desc))')返回結果集中的唯一字段為中位值
      

  9.   

    湖泊兄的想法不错。参数就是colname和tablename。
    这实际上是我说的第二种方法,就是给出了select语句求中位数,既然如此,那么单表和多表就没有影响了。所谓多表应该不是多表中多个字段的中位数,而应该是一个字段的中位数,多表也就只是在from后面出现了。
      

  10.   

    设表名tablename ,求中位数的字段是id,且id已排除重复数据。
    select avg(id) 
    from (select id
          from tablename t0
          where (select count(*) 
                 from tablename t1  
                 where t1.id<t0.id)
                -
                (select count(*) 
                 from tablename t2
                 where t2.id>t0.id) 
                in (0,1,-1)
          )
      

  11.   

    其实我觉得湖泊和按钮工厂的做法都可以解决问题,至于要写一个类似于avg的函数,那就要微软去做了。
      

  12.   

    这样讲吧,一个数列,对于其中某个数ID,若小于ID的数值个数是mincount ,大于的数值个数是maxcount,若满足以下条件:
    mincount-maxcount=0  (数列有奇数个数时)
    mincount-maxcount=1或-1  (数列有偶数个数时)
    对所有满足条件的ID,再求平均值就是中位数了。数列有奇数个数时只会有一个这样的ID,平均值就是这个ID了。
    数列有偶数个数时会有两个这样的ID,求平均值就对了。关键在于这样的算法需要保证:
    1、数列有奇数个数时有且只有一个这样的ID
    2、数列有偶数个数时有且只有两个这样的ID
    很容易证明以上论断的,不详细说了。