代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

如何获得SQL(多级聚合)中的平均值?

  •  4
  • paxdiablo  · 技术社区  · 15 年前

    我有一张简化的桌子 xx 如下:

    rdate  date
    rtime  time
    rid    integer
    rsub   integer
    rval   integer
    primary key on (rdate,rtime,rid,rsub)
    

    我想得到这些值的总和(所有ID)的平均值。

    通过一个示例表,我已经(为了可读性,连续的相同值被删去了):

    rdate       rtime     rid  rsub  rval
    -------------------------------------
    2010-01-01  00.00.00    1     1    10
                                  2    20
                            2     1    30
                                  2    40
                01.00.00    1     1    50
                                  2    60
                            2     1    70
                                  2    80
                02.00.00    1     1    90
                                  2   100
    2010-01-02  00.00.00    1     1   999
    

    我可以得到我想要的总数:

    select rdate,rtime,rid, sum(rval) as rsum
    from xx
    where rdate = '2010-01-01'
    group by rdate,rtime,rid
    

    这给了我:

    rdate       rtime     rid  rsum
    -------------------------------
    2010-01-01  00.00.00    1    30  (10+20)
                            2    70  (30+40)
                01.00.00    1   110  (50+60)
                            2   150  (70+80)
                02.00.00    1   190  (90+100)
    

    果不其然。

    现在,我想要的是查询,它还将在时间维度上平均这些值,并给出:

    rdate       rtime    ravgsum
    ----------------------------
    2010-01-01  00.00.00      50  ((30+70)/2)
                01.00.00     130  ((110+150)/2)
                02.00.00     190  ((190)/1)
    

    我正在使用DB2 for z/OS,但如果可能的话,我更喜欢标准的SQL。

    2 回复  |  直到 15 年前
        1
  •  4
  •   paxdiablo    15 年前
    select rdate,rtime,avg(rsum) as ravgsum from (
        select rdate,rtime,rid, sum(rval) as rsum
        from xx
        where rdate = '2010-01-01'
        group by rdate,rtime,rid
    ) as subq
    group by rdate,rtime
    
        2
  •  1
  •   paxdiablo    15 年前

    怎么样

    select rdate,rtime, sum(rsum) / count(rsum) as sumavg
    from
    (select rdate, rtime, rid, sum(rval) as rsum
    from xx
    where rdate = '2010-01-01'
    group by rdate,rtime,rid) as subq
    group by rdate,rtime