比如某个用户在某一年录入了很多条血压数据, 先我想按周来求出平均数。 (周从星期天为开始 周六为结束)
显示效果 如2013-01-01到2013-01-05   88
2013-01-06到2013-01-12   99
2013-03-10到2013-03-16   120
         .......急求啊!  大神们帮帮忙啊!!!!oracle数据库 周平均数

解决方案 »

  1.   


    with 
    a as --原始数据 
    (
      select to_date('2012-12-30','YYYY-MM-DD') startdate,
             to_date('2012-12-31','YYYY-MM-DD') enddate,
             88    value1 
        from dual
       union all
      select to_date('2013-01-01','YYYY-MM-DD') startdate,
             to_date('2013-01-05','YYYY-MM-DD') enddate,
             88    value1 
        from dual
       union all
      select to_date('2013-01-06','YYYY-MM-DD') startdate,
             to_date('2013-01-12','YYYY-MM-DD') enddate,
             99    value1 
        from dual
       union all
      select to_date('2013-03-10','YYYY-MM-DD') startdate,
             to_date('2013-03-16','YYYY-MM-DD') enddate,
             120    value1 
        from dual
    ),
    b as --根据原始数据构造周表
    (select (rownum-1)*7+(select  trunc(min(startdate),'day') from a) startdate,--一周起始日期
            rownum*7-1+(select  trunc(min(startdate),'day')  from a)  enddate --一周结束日期
      from dual 
     connect by rownum <=(select max(enddate)-min(startdate) from a)/7+2
     )
    select b.startdate,
           b.enddate,
           sum((least(a.enddate,b.enddate)-greatest(a.startdate,b.startdate)+1 )*a.value1)/sum((least(a.enddate,b.enddate)-greatest(a.startdate,b.startdate)+1 )*1) avgvalue
      from a,b
     where a.startdate<=b.enddate and a.enddate>=b.startdate
    group by b.startdate,b.enddate
    结果如下:
    1 2012-12-30 2013-01-05 88
    2 2013-01-06 2013-01-12 99
    3 2013-03-10 2013-03-16 120
      

  2.   

    提供个简单的思路给你
    1、首先你需要计算出各日期对应的各周归集日(可以用各周星期6)
    2、按各周归集日分组并取血压平均值
    将今天归集到周归集日上计算方法:
    select next_day(trunc(sysdate),7) from dual;--7表示当前周最后一天(星期6)。
      

  3.   


    with tb_data as(
    select '20130101' d, 88 v from dual union all
    select '20130103' d, 87 v from dual union all
    select '20130104' d, 82 v from dual union all
    select '20130105' d, 92 v from dual union all
    select '20130106' d, 102 v from dual union all
    select '20130107' d, 102 v from dual union all
    select '20130108' d, 98 v from dual union all
    select '20130109' d, 92 v from dual union all
    select '20130110' d, 94 v from dual union all
    select '20130113' d, 88 v from dual union all
    select '20130115' d, 92 v from dual union all
    select '20130116' d, 94 v from dual )
    select xd-6 "开始日期", xd "结束日期", trunc(avg(v), 2) "均值"
     from (select t.*, next_day(to_date(d, 'YYYYMMDD'), 7) xd from tb_data t)
     group by xd;
      

  4.   

    SELECT      TO_CHAR (MIN (oxygentime), 'yyyy-mm-dd')
             || '到'
             || TO_CHAR (MAX (oxygentime), 'yyyy-mm-dd') "日期范围",
             ROUND (AVG (eos),2) "平均血压"
        FROM your_table
    GROUP BY TO_CHAR (DECODE (TO_CHAR (oxygentime, 'D'), 1, oxygentime + 1, oxygentime), 'iw');
      

  5.   

    with tb_data as (
    select '2013-01-12' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2012-01-06' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2013-01-02' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2013-01-05' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2013-03-08' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2013-03-06' oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select '2013-03-07' oxygentime, 55 eos, 55 pulse, 125 userid from dual
    )
    select xd-6 "开始日期", xd "结束日期", trunc(avg(eos + pulse), 2) "均值"
     from (select t.*, next_day(to_date(oxygentime, 'YYYY-MM-DD'), 7) xd from tb_data t)
     group by xd;
      

  6.   


    with tb_data as (
    select to_date('2013-01-12','YYYY-MM-DD') oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select to_date('2012-01-06','YYYY-MM-DD') oxygentime, 55 eos, 55 pulse, 125 userid from dual union all
    select to_date('2013-01-02','YYYY-MM-DD') oxygentime, 44 eos, 33 pulse, 125 userid from dual union all
    select to_date('2013-01-05','YYYY-MM-DD') oxygentime, 33 eos, 33 pulse, 125 userid from dual union all
    select to_date('2013-03-08','YYYY-MM-DD') oxygentime, 63.25 eos, 63.25 pulse, 125 userid from dual union all
    select to_date('2013-03-06','YYYY-MM-DD') oxygentime, 55 eos, 66 pulse, 125 userid from dual union all
    select to_date('2013-03-07','YYYY-MM-DD') oxygentime, 44 eos, 55 pulse, 125 userid from dual
    )
    select trunc(oxygentime,'day'),
           trunc(oxygentime,'day')+6,
           userid,
           avg(eos),
           avg(pulse) 
      from tb_data
     group by trunc(oxygentime,'day'),userid
    1 2012-01-01 2012-01-07 125 55 55
    2 2012-12-30 2013-01-05 125 38.5 33
    3 2013-01-06 2013-01-12 125 55 55
    4 2013-03-03 2013-03-09 125 54 61.4
      

  7.   


    select trunc(oxygentime,'day'),
           trunc(oxygentime,'day')+6,
           userid,
           avg(eos),
           avg(pulse) 
      from tb_data
     group by trunc(oxygentime,'day'),userid