Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle组按时间段限定行,包括零计数_Sql_Oracle_Window Functions - Fatal编程技术网

Sql Oracle组按时间段限定行,包括零计数

Sql Oracle组按时间段限定行,包括零计数,sql,oracle,window-functions,Sql,Oracle,Window Functions,假设我有一个Oracle 10g表,它记录了系统上的所有响应时间。如何按日期统计慢交易,包括没有慢交易的日期的零计数 例如 create table response_times (system_datetime timestamp, server_name varchar2(3), response_time number(9)); insert into response_times (system_datetime, server_name, response_time) values

假设我有一个Oracle 10g表,它记录了系统上的所有响应时间。如何按日期统计慢交易,包括没有慢交易的日期的零计数

例如

create table response_times (system_datetime timestamp, server_name varchar2(3), response_time number(9));

insert into response_times (system_datetime, server_name, response_time)
values (to_date('01/05/2014 12:30', 'DD/MM/YYYY HH24:MI'), 'D01', 500);

insert into response_times (system_datetime, server_name, response_time)
values (to_date('01/05/2014 13:45', 'DD/MM/YYYY HH24:MI'), 'D02', 700);

insert into response_times (system_datetime, server_name, response_time)
values (to_date('01/05/2014 14:01', 'DD/MM/YYYY HH24:MI'), 'D01', 2500);

insert into response_times (system_datetime, server_name, response_time)
values (to_date('02/05/2014 07:45', 'DD/MM/YYYY HH24:MI'), 'D02', 2500);

insert into response_times (system_datetime, server_name, response_time)
values (to_date('02/05/2014 08:30', 'DD/MM/YYYY HH24:MI'), 'D02', 500);
我想查看响应时间超过2000毫秒的事务数,如下所示:

TRUNC(system_datetime)  D01    D02
=====================   ===    ===
2014/05/01              1      0
2014/05/02              0      1
2014/05/03              0      0
有没有一种方法可以在一条sql语句中检索到它?在实践中,将有数百万行,希望每天只有少量缓慢的事务,并且在某些天根本不会有缓慢的事务


现在我知道我可以编写一个简短的PL/SQL过程,使用一个候选日期的临时表和一个循环来为每个时间段发出一个select count*以获取计数值,但我希望有一种更优雅的方法…

关键是生成日期。这里有一种方法:

with n as (
      select level as lvl from dual
      connect by level < 5
     ),
     dates as (
      select (to_date('2014-05-01', 'YYYY-MM-DD') + lvl - 1) as d
      from n
     )
select dates.d, coalesce(r.D01, 0) as D01, coalesce(r.D02, 0) as D02
from dates left outer join
     (select TRUNC(system_datetime) as dt,
             sum(case when server_name = 'D01' then 1 else 0 end) as D01,
             sum(case when server_name = 'D02' then 1 else 0 end) as D02
      from response_times
      group by TRUNC(system_datetime) 
     ) r
     on dates.d = r.dt;

一旦你有了日期,剩下的只是一个左外连接。

太棒了,我可以用这个。非常感谢。