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;

  • 相关阅读:
    Part 17 Consuming ASP NET Web Service in AngularJS using $http
    Part 16 ng include directive in AngularJS
    Part 15 AngularJS ng init directive
    文本框
    mint上部署lamp环境
    18种有效有趣的读书方法(转载)
    可扩展的架构设计
    iisreset和w3wp的关系
    Ajax请求中带有IPv6地址后的百分号的问题
    IE中JavaScript 的异常处理
  • 原文地址:https://www.cnblogs.com/feifeicui/p/10289732.html
Copyright © 2011-2022 走看看