ID 地区 名称 日期 收视率
1 北京 铁道游击队 2006-8-15 .56
2 北京 铁道游击队 2006-8-16 .59
3 北京 铁道游击队 2006-8-17 .45
4 北京 铁道游击队 2006-8-18 .52
5 北京 铁道游击队 2006-8-19 .63
6 北京 铁道游击队 2006-8-20 .86
7 北京 铁道游击队 2006-8-21 .27
8 北京 铁道游击队 2006-8-22 .65
9 北京 铁道游击队 2006-8-23 .54
10 天津 大宅门          2006-7-23 .25
11 天津 大宅门          2006-7-24 .26
12 天津 大宅门          2006-7-25 .42
13 天津 大宅门          2006-7-26 .36
14 天津 大宅门          2006-7-27 .52
15 天津 大宅门          2006-7-28 .31
16 天津 大宅门          2006-7-29 .26
17 天津 大宅门          2006-7-30 .53以上是原始数据表,我想求出每个地区每个名称的后段平均收视率除于前段平局收视率的比值。
后段平均收视率:指排在后半部分的记录(大于总数的一半)。如北京地区的铁道游击队,后段记录是指id为5、6、7、8、9的那些记录。后段平均收视率就是这些记录的收视率的平均值。
前段平均收视率:指排在前半部分的记录(小于或等于总数的一半)。如北京地区的铁道游击队,前段记录是指id为1、2、3、4的那些记录。前段平均收视率就是这些记录的收视率的平均值。如上例,我想得出的结果是:
地区 名称               平均收视率前后之比
北京 铁道游击队      1.39150943396226
天津 大宅门               1.25581395348837

解决方案 »

  1.   

    select  a.地区,a.名称,后段收视率/前段收视率 as 平均收视率前后之比
    from (
    select 地区,名称,avg(收视率) as 后段收视率 from tablename a
    where  id in (select top 50 percent id from tablename where 地区=a.地区 and 名称=a.名称 order by 日期 desc)
    group by 地区,名称
    ) as a,(
    select 地区,名称,avg(收视率) as 前段收视率 from tablename a
    where  id not in (select top 50 percent  id from tablename where 地区=a.地区 and 名称=a.名称 order by 日期 desc)
    group by 地区,名称
    ) as b
    where a.地区=b.地区 and a.名称=b.名称--top 50 percent 返回总数的一半,如果总数是奇数,则比没显示的多一条
      

  2.   

    lect  a.地区,a.名称,后段收视率/前段收视率 as 平均收视率前后之比
    from (
    select 地区,名称,avg(收视率) as 后段收视率 from tablename a
    where  id in (select top 50 percent id from tablename where 地区=a.地区 and 名称=a.名称 order by 日期 desc)
    group by 地区,名称
    ) as a,(
    select 地区,名称,avg(收视率) as 前段收视率 from tablename a
    where  id not in (select top 50 percent  id from tablename where 地区=a.地区 and 名称=a.名称 order by 日期 desc)
    group by 地区,名称
    ) as b
    where a.地区=b.地区 and a.名称=b.名称具体问题具体分析!
      

  3.   

    if object_id('tempdb..#') is not null drop table #
    select 1 as Id, '北京' as 地区, '铁道游击队' as 名称, '2006-8-15' as 日期, 0.56 as 收视率
    into #
    union select 2, '北京', '铁道游击队', '2006-8-16', 0.59
    union select 3, '北京', '铁道游击队', '2006-8-17', 0.45
    union select 4, '北京', '铁道游击队', '2006-8-18', 0.52
    union select 5, '北京', '铁道游击队', '2006-8-19', 0.63
    union select 6, '北京', '铁道游击队', '2006-8-20', 0.86
    union select 7, '北京', '铁道游击队', '2006-8-21', 0.27
    union select 8, '北京', '铁道游击队', '2006-8-22', 0.65
    union select 9, '北京', '铁道游击队', '2006-8-23', 0.54
    union select 10, '天津', '大宅门', '2006-7-23', 0.25
    union select 11, '天津', '大宅门', '2006-7-24', 0.26
    union select 12, '天津', '大宅门', '2006-7-25', 0.42
    union select 13, '天津', '大宅门', '2006-7-26', 0.36
    union select 14, '天津', '大宅门', '2006-7-27', 0.52
    union select 15, '天津', '大宅门', '2006-7-28', 0.31
    union select 16, '天津', '大宅门', '2006-7-29', 0.26
    union select 17, '天津', '大宅门', '2006-7-30', 0.53
    go
    ----------------------
    select a.地区, a.名称,
        sum(case when Num < Id then 收视率 end) * sum(case when Num >= Id then 1 end) /
        sum(case when Num >= Id then 收视率 end) / sum(case when Num < Id then 1 end) as 平均收视率前后之比
    from (select (select count(1) + 1 from # where 地区 = aa.地区 and 名称 = aa.名称 and Id < aa.Id) as Id, 地区, 名称, 收视率 from # aa) a 
    join (select 地区, 名称, count(1) / 2 as Num 
          from # 
          group by 地区, 名称) b on a.地区 = b.地区 and a.名称 = b.名称
    group by a.地区, a.名称
    /*
    地区   名称         平均收视率前后之比
                                    
    天津   大宅门       1.255813
    北京   铁道游击队   1.113207*/
    ----------------------
    drop table #
      

  4.   

    说错了,是少一条。csdn里怎么编辑自己的帖子啊?