简体   繁体   English

计算Oracle中的运行总数

[英]Count running total in Oracle

I want to make a query, which shows the progress of the number of users on my webpage by week. 我要查询,以每周显示我网页上用户数量的进度。

I use following query to run the users database and get the number, grouped by a week: 我使用以下查询来运行用户数据库并获取按星期分组的数字:

SELECT TRUNC(FAB.LICENSE_DATE, 'IW'),
       COUNT(DISTINCT FAB.STATEMENT_NUMBER) AS "Number of account statements"
  FROM USERS FAB
 GROUP BY TRUNC(FAB.LAST_UPDATED_TIME, 'IW');

This gives following output: 这给出以下输出:

 Date        |  Users
----------------------
 2015/09/07  |  5
 2015/09/14  |  4
 2015/09/21  |  6

But this is actually not what I want to achieve. 但这实际上不是我想要实现的。 I want to have the following output: 我想要以下输出:

 Date        | Users
----------------------
 2015/09/07  | 5
 2015/09/14  | 9 (5 + 4)
 2015/09/21  | 15 (5 + 4 + 6)

How to modify the query so I get all the results? 如何修改查询,以便获得所有结果?

SELECT TRUNC(FAB.LICENSE_DATE, 'IW'), 
SUM(COUNT(DISTINCT FAB.STATEMENT_NUMBER)) OVER (ORDER BY  TRUNC(FAB.LAST_UPDATED_TIME, 'IW')) as "Number of account statements"
FROM USERS FAB
GROUP BY TRUNC(FAB.LAST_UPDATED_TIME, 'IW');

SQL Fiddle SQL小提琴

Oracle 11g R2 Schema Setup : Oracle 11g R2架构设置

CREATE TABLE USERS (
  LICENSE_DATE,
  LAST_UPDATED_TIME,
  STATEMENT_NUMBER
) AS
          SELECT DATE '2015-09-07', DATE '2015-09-07', 1 FROM DUAL
UNION ALL SELECT DATE '2015-09-08', DATE '2015-09-08', 2 FROM DUAL
UNION ALL SELECT DATE '2015-09-08', DATE '2015-09-08', 3 FROM DUAL
UNION ALL SELECT DATE '2015-09-09', DATE '2015-09-09', 4 FROM DUAL
UNION ALL SELECT DATE '2015-09-12', DATE '2015-09-12', 5 FROM DUAL
UNION ALL SELECT DATE '2015-09-14', DATE '2015-09-15', 6 FROM DUAL
UNION ALL SELECT DATE '2015-09-15', DATE '2015-09-16', 7 FROM DUAL
UNION ALL SELECT DATE '2015-09-16', DATE '2015-09-16', 8 FROM DUAL
UNION ALL SELECT DATE '2015-09-17', DATE '2015-09-18', 9 FROM DUAL
UNION ALL SELECT DATE '2015-09-21', DATE '2015-09-21', 10 FROM DUAL
UNION ALL SELECT DATE '2015-09-21', DATE '2015-09-26', 11 FROM DUAL
UNION ALL SELECT DATE '2015-09-22', DATE '2015-09-22', 12 FROM DUAL
UNION ALL SELECT DATE '2015-09-23', DATE '2015-09-25', 13 FROM DUAL
UNION ALL SELECT DATE '2015-09-24', DATE '2015-09-24', 14 FROM DUAL
UNION ALL SELECT DATE '2015-09-27', DATE '2015-09-27', 15 FROM DUAL;

Query 1 : 查询1

SELECT LAST_UPDATED_WEEK,
       SUM( NUM_STATEMENTS ) OVER ( ORDER BY LAST_UPDATED_WEEK ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS "Number of account statements"
FROM (
  SELECT TRUNC(LAST_UPDATED_TIME, 'IW') AS LAST_UPDATED_WEEK,
         COUNT(DISTINCT STATEMENT_NUMBER) AS NUM_STATEMENTS
  FROM   USERS
  GROUP BY
         TRUNC( LAST_UPDATED_TIME, 'IW')
)

Results : 结果

|           LAST_UPDATED_WEEK | Number of account statements |
|-----------------------------|------------------------------|
| September, 07 2015 00:00:00 |                            5 |
| September, 14 2015 00:00:00 |                            9 |
| September, 21 2015 00:00:00 |                           15 |

You can use this code block for your problem : 您可以使用此代码块解决问题:

select u.date ,(select sum(u1.users) from users u1 where u1.ddate <= u.date) as users from users u;

It gives this output : 它给出以下输出:

07.09.2015 5 14.09.2015 9 21.09.2015 15

Good luck 祝好运

Hello you can try this code too.

WITH t1 AS
  ( SELECT to_date('01/01/2015','mm/dd/yyyy') rn, 5 usrs FROM dual
  UNION ALL
  SELECT to_date('02/01/2015','mm/dd/yyyy') rn, 4 usrs FROM dual
  UNION ALL
  SELECT to_date('03/01/2015','mm/dd/yyyy') rn, 8 usrs FROM dual
  UNION ALL
  SELECT to_date('04/01/2015','mm/dd/yyyy') rn, 2 usrs FROM dual
  )
SELECT rn,
  usrs,
  sum(usrs) over (order by rn ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) cumm_usrs
FROM t1
GROUP BY rn,
  usrs;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM