平均数、中位数、众数都是度量一组数据集中趋势的统计量。所谓集中趋势是指一组数据向某一中心值靠拢的倾向,测度集中趋势就是寻找数据一般水平的代表值或中心值。而这三个特征数又各有特点,能够从不同的角度提供信息。

平均数


  • 特点:计算用到所有的数据,它能够充分利用数据提供的信息,它具有优 的数学性质,因此在实际应用中较为广泛。但它受极端值的影响较大。
  • 应用场合:没有极端值的情况下数据集中趋势的刻画。
  • 如:小明五次测试的成绩好下,87、88、89、93、94你认为小明这五次测试成绩怎样?
  • 分析:

中位数


  • 特点:中位数是一组数据中间位置的代表值。计算简单,不受极端值的影响,但不能充分利用每个数据所提供的信息。
  • 应用场合:有极端值,且无某数据重复出现多次的情况下集中趋势的刻画。
  • 如:某公司员工月工资如下:
    这个公司员工的月工资有一般水平是多少?
  • 员工         经理 副经理 员工a  员工b  员工c   员工d   员工e   员工f    杂工
  • 月工资/元 6000 4000   1700  1300   1200    1100    1100    1100     500
  • 分析:这组数据的平均数是2000,而高于这一水平的只有2人,不具有代表性。其中位数是1200,处于其相当水平的有5人,占大多数。较好的反映了一般水平。

众数


  • 特点:众数是一组数据中出现次数最多的数据。不受极端值的影响,当一组数据中某些数据多次重复出现时,众数往往是人们最关心的一个量。但它不能象平均数那样充分利用数据提供信息。
  • 应用场合:有极端值,有某些数据多次重复出现时。
  • 如:一家鞋店在一段时间内销售了某种女鞋30双,各种尺码鞋的销量如下:
    你能为这家鞋店提供进货建议吗?
  • 尺码/厘米   22   22.5   23    23.5    24    24.5    25
  • 销售量/双    1     1        2       5      15      5        1
  • 分析:由于进货最关心的是哪种尺码的鞋最多,而这里很明显24码的要占相当大的量15双。较好的得到所需信息。

SqlServer验证


CREATE TABLE graduates (
  name varchar(255) ,
  income int 
)
go
 
INSERT INTO graduates VALUES ('桑普森', '400000');
INSERT INTO graduates VALUES ('迈克', '30000');
INSERT INTO graduates VALUES ('怀特', '20000');
INSERT INTO graduates VALUES ('阿诺德', '20000');
INSERT INTO graduates VALUES ('史密斯', '20000');
INSERT INTO graduates VALUES ('劳伦斯', '15000');
INSERT INTO graduates VALUES ('哈德逊', '15000');
INSERT INTO graduates VALUES ('肯特', '10000');
INSERT INTO graduates VALUES ('贝克', '10000');
INSERT INTO graduates VALUES ('斯科特', '10000');

取众数


select income,count(*) cnt 
from graduates
group by income
having count(*) >= (
  select max(cnt) from (select count(*) cnt from graduates group by income) tmp
)

取中位数


select AVG(DISTINCT income)
from (
select T1.income from graduates T1,graduates T2
group by T1.income
having sum(case when T2.income >= T1.income then 1 else 0 end) >= count(*)/2
and sum(case when T2.income <= T1.income then 1 else 0 end) >= count(*)/2
) tmp
go

取众数对应的行

 


/*需求电压众数*/
update ETL_Day_UserCar set ETL_Day_UserCar.DVMode = a.DVMode
  from (
        select a.BizDate,a.CustID,a.CarModel,a.maxdv as DVMode,count(1) as RecordCount, 
        Row_NUMBER() OVER(PARTITION BY BizDate,CustID,CarModel ORDER BY count(1) DESC) AS SN
        from ETL_UserCarReset a with(nolock)    
        group by a.BizDate,a.CustID,a.CarModel,a.maxdv
       ) a
 where ETL_Day_UserCar.BizDate = a.BizDate
   and ETL_Day_UserCar.CustID = a.CustID
   and ETL_Day_UserCar.CarModel = a.CarModel
   and a.SN = '1'
go