2015-05-07 52 views
0

我有一个JDBC数据库(特别是DB2,但正在寻找某种与数据库无关的东西,至少在DB2和Oracle上),该表有一个每10分钟记录一次的插入记录并提供有关该应用程序运行的API的统计信息。它看起来是这样的:SQL:按日期分组并按列求和值

StatKey, StartDate, EndDate, APIName, StatName, StatValue 
201505071498224437562706 2015-05-07 14:12:44.0 2015-05-07 14:22:44.0 API5 Invocations 34 
201505071498161437466684 2015-05-07 14:06:14.0 2015-05-07 14:16:14.0 API4 Invocations 79 
201505071498060937466556 2015-05-07 13:56:08.0 2015-05-07 14:06:08.0 API4 Average 26,264.37 
201505071497263437627286 2015-05-07 14:16:33.0 2015-05-07 14:26:34.0 API2 Invocations 24 
201505071497262137620812 2015-05-07 14:16:19.0 2015-05-07 14:26:20.0 API2 Invocations 24 
201505071497024537466378 2015-05-07 13:52:43.0 2015-05-07 14:02:44.0 API1 Average 6,830,050 
201505071497023337466368 2015-05-07 13:52:31.0 2015-05-07 14:02:32.0 API3 Average 31,523 
201505071496023337466361 2015-05-07 13:52:31.0 2015-05-07 14:02:32.0 API2 Invocations 1 
201505071494263837628892 2015-05-07 14:16:36.0 2015-05-07 14:26:37.0 API5 Invocations 68 
201505071493124437466656 2015-05-07 14:02:44.0 2015-05-07 14:12:44.0 API1 Invocations 2 
201505071492263037625304 2015-05-07 14:16:29.0 2015-05-07 14:26:30.0 API3 Average 179,223.29 

每隔10分钟,在此期间执行的任何API都会有类似上面的条目。但是,多个JVM将写入同一个数据库,因此开始和结束时间不仅仅是每10分钟一次,并且每小时可能有6个以上的条目。

我想要做的是创建一个SQL,它将每小时对所有API的调用每小时的运行时间进行分组。例如: - 在

Date&Hour, API, Invocations 
2015-05-07 12:00, API1, 100 
2015-05-07 12:00, API2, 150 
2015-05-07 13:00, API2, 200 
etc... 

我试着做一个GROUP BY基于主键的SUBSTR(但之间的小时和分钟2个随机数字这始终是时间戳加上一些随机数)小时标记,但我不知道如何每小时添加所有StatName = Invocations。

有人可以提供一些想法,我可能会做到这一点?

回答

1

另一种可能的解决方案:

select to_char(StarDate,'rrrr-mm-dd HH24:')||'00' as DateHour, 
    APIName as API, 
    sum(StatValue) as Invocations 
from STATISTICS 
where StatName = 'Invocations' 
group by to_char(StarDate,'rrrr-mm-dd HH24:')||'00', APIName 

有型动物的方式来做到这一点..

祝你好运!

+0

这里给出的一切都是一个很好的解决方案,但是对于我的需求来说,这是相对简单的,并且似乎对我最好。谢谢。 – Matt

1

不是很确定你在做什么吗?

在本质上它看起来在YYYYMMDDHH 10的位置,因为它们包含在...的值组,然后求和基于调用仅

SELECT substr(statKey,1,10) as DH, APIName, Sum(Statvalue) Invocations 
FROM TableName 
WHERE StatName = 'Invocations' 
GROUP BY substr(statKey,1,10), APIName, StatName 

实施例:

WITH CTE AS 
    (SELECT '201505071498224437562706' AS StatKey, 
    '2015-05-07 14:12:44.0'   AS StartDate, 
    '2015-05-07 14:22:44.0'   AS EndDate, 
    'API5'       AS APIName, 
    'Invocations'     AS StatName, 
    34        AS statvalue 
    FROM dual 
    UNION ALL 
    SELECT '201505071498161437466684', 
    '2015-05-07 14:06:14.0', 
    '2015-05-07 14:16:14.0', 
    'API4', 
    'Invocations', 
    79 
    FROM dual 
    UNION ALL 
    SELECT '201505071498060937466556', 
    '2015-05-07 13:56:08.0', 
    '2015-05-07 14:06:08.0', 
    'API4', 
    'Average', 
    26264.37 
    FROM dual 
) 
SELECT substr(statKey,1,10) as DH, APIName, StatName, Sum(Statvalue) 
FROM TableName 
WHERE StatName = 'Invocations' 
GROUP BY substr(statKey,1,10), APIName, StatName 
1

对于至少DB2,为什么不只是

select date(startdate) as start_date 
     , hour(startdate) as start_hour 
     , API 
     , sum(statvalue) as Invocations 
from mytbl 
where statname = 'Invocations' 
group by date(startdate), hour(startdate), API 

我会留下它作为一个练习,为您结合日期和小时回到时间放大器如果那是你真正想要的...

1
SQL Fiddle

的Oracle 11g R2架构设置

CREATE TABLE Data AS 
      SELECT '201505071498224437562706' AS StatKey, TO_DATE('2015-05-07 14:12:44', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:22:44', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API5' AS APIName, 'Invocations' AS StatName, 34 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071498161437466684' AS StatKey, TO_DATE('2015-05-07 14:06:14', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:16:14', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API4' AS APIName, 'Invocations' AS StatName, 79 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071498060937466556' AS StatKey, TO_DATE('2015-05-07 13:56:08', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:06:08', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API4' AS APIName, 'Average' AS StatName, 26264.37 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071497263437627286' AS StatKey, TO_DATE('2015-05-07 14:16:33', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:26:34', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API2' AS APIName, 'Invocations' AS StatName, 24 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071497262137620812' AS StatKey, TO_DATE('2015-05-07 14:16:19', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:26:20', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API2' AS APIName, 'Invocations' AS StatName, 24 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071497024537466378' AS StatKey, TO_DATE('2015-05-07 13:52:43', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:02:44', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API1' AS APIName, 'Average' AS StatName, 6830050 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071497023337466368' AS StatKey, TO_DATE('2015-05-07 13:52:31', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:02:32', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API3' AS APIName, 'Average' AS StatName, 31523 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071496023337466361' AS StatKey, TO_DATE('2015-05-07 13:52:31', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:02:32', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API2' AS APIName, 'Invocations' AS StatName, 1 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071494263837628892' AS StatKey, TO_DATE('2015-05-07 14:16:36', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:26:37', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API5' AS APIName, 'Invocations' AS StatName, 68 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071493124437466656' AS StatKey, TO_DATE('2015-05-07 14:02:44', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:12:44', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API1' AS APIName, 'Invocations' AS StatName, 2 AS StatValue FROM DUAL 
UNION ALL SELECT '201505071492263037625304' AS StatKey, TO_DATE('2015-05-07 14:16:29', 'YYYY-MM-DD HH24:MI:SS') AS StartDate, TO_DATE('2015-05-07 14:26:30', 'YYYY-MM-DD HH24:MI:SS') AS EndDate, 'API3' AS APIName, 'Average' AS StatName, 179223.29 AS StatValue FROM DUAL; 

查询1

SELECT TRUNC(EndDate, 'HH') AS "Date&Hour", 
     APIName, 
     SUM(StatValue) AS Invocations 
FROM  Data 
WHERE StatName = 'Invocations' 
GROUP BY TRUNC(EndDate, 'HH'), 
     APIName 

Results

|    Date&Hour | APINAME | INVOCATIONS | 
|-----------------------|---------|-------------| 
| May, 07 2015 14:00:00 | API2 |   49 | 
| May, 07 2015 14:00:00 | API5 |   102 | 
| May, 07 2015 14:00:00 | API1 |   2 | 
| May, 07 2015 14:00:00 | API4 |   79 | 
+0

DB2似乎具有[TRUNC函数](http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0000863.html ?cp = SSEPGG_9.7.0%2F2-10-3-2-168)以及我认为这应该对两者都有效(但不能测试它)。 – MT0

1

日期函数似乎很难以数据库不可知的方式实现。

对于数据库无关的解决方案,我建议在隐藏的DB-特定代码执行的数据库创建视图,并因此使您可以使用一个简单的选择没有任何语法问题。