zoukankan      html  css  js  c++  java
  • 大数据学习——面试用sql——累计报表

    create table t_access_times(username string,month string,salary int)
    row format delimited fields terminated by ',';

    load data local inpath '/root/hivedata/t_access_times.dat' into table t_access_times;

    A,2015-01,5
    A,2015-01,15
    B,2015-01,5
    A,2015-01,8
    B,2015-01,25
    A,2015-01,5
    A,2015-02,4
    A,2015-02,6
    B,2015-02,10
    B,2015-02,5


    1、第一步,先求个用户的月总金额
    select username,month,sum(salary) as salary from t_access_times group by username,month

    +-----------+----------+---------+--+
    | username | month | salary |
    +-----------+----------+---------+--+
    | A | 2015-01 | 33 |
    | A | 2015-02 | 10 |
    | B | 2015-01 | 30 |
    | B | 2015-02 | 15 |
    +-----------+----------+---------+--+

    2、第二步,将月总金额表 自己连接 自己连接
    select A.*,B.* FROM
    (select username,month,sum(salary) as salary from t_access_times group by username,month) A
    inner join
    (select username,month,sum(salary) as salary from t_access_times group by username,month) B
    on
    A.username=B.username
    where B.month <= A.month
    +-------------+----------+-----------+-------------+----------+-----------+--+
    | a.username | a.month | a.salary | b.username | b.month | b.salary |
    +-------------+----------+-----------+-------------+----------+-----------+--+
    | A | 2015-01 | 33 | A | 2015-01 | 33 |
    | A | 2015-01 | 33 | A | 2015-02 | 10 |
    | A | 2015-02 | 10 | A | 2015-01 | 33 |
    | A | 2015-02 | 10 | A | 2015-02 | 10 |
    | B | 2015-01 | 30 | B | 2015-01 | 30 |
    | B | 2015-01 | 30 | B | 2015-02 | 15 |
    | B | 2015-02 | 15 | B | 2015-01 | 30 |
    | B | 2015-02 | 15 | B | 2015-02 | 15 |
    +-------------+----------+-----------+-------------+----------+-----------+--+

    3、第三步,从上一步的结果中
    进行分组查询,分组的字段是a.username a.month
    求月累计值: 将b.month <= a.month的所有b.salary求和即可
    select A.username,A.month,max(A.salary) as salary,sum(B.salary) as accumulate
    from
    (select username,month,sum(salary) as salary from t_access_times group by username,month) A
    inner join
    (select username,month,sum(salary) as salary from t_access_times group by username,month) B
    on
    A.username=B.username
    where B.month <= A.month
    group by A.username,A.month
    order by A.username,A.month;

  • 相关阅读:
    kettle表输入条件参数设置
    batの磕磕碰碰
    bat调用kettle的job文件
    数组转换成字符串输出
    bat调用带参数存储过程
    读取属性文件
    剑指Offer——删除链表中重复的结点
    剑指Offer——链表中环的入口节点
    剑指Offer——两个链表的第一个公共节点
    剑指Offer——表示数值的字符串
  • 原文地址:https://www.cnblogs.com/feifeicui/p/10289732.html
Copyright © 2011-2022 走看看