sql查看最大值,每小时计算一次

Loc*_*ock 2 sql oracle

在某些SQL中需要一些帮助.

我有以下需要构建的报告,但理想情况下我想尝试使用SQL脚本构建它,而不是必须每小时运行一次.

我们正在解决的业务问题基本上是按小时计算产品在给定周内占用的最大位置数.

我知道我可以通过每小时运行一个计算金额的程序并将其插入表中来实现.然后,我会在本周末查询此表,并查看哪一天的哪个小时数最多.

理想情况下,我想在不使用程序的情况下这样做.我写的SQL可以告诉我任何时间点的数字(比如星期一上午10-11点之间).

而不是复制和粘贴这个SQL脚本24 x 7次(每天一小时1),我还可以通过SQL脚本在这里做些什么吗?我可以创建一个每天都有维护表,列出时间段(例如列将是:day,hour_start,hour_end),将它连接到我的查询并使用max函数?

我很确定它不能通过海峡SQL来完成,但我不是时间依赖程序运行的粉丝(例如,如果服务器要脱机会怎样).

任何建议赞赏!

Eri*_*ler 5

假设有这样的数据结构:

create table room_usage ( 
   roomnumber number(6),
   occupied_by varchar2(20),
   startdate date,
   enddate date
);
Run Code Online (Sandbox Code Playgroud)

您可以像这样查询每小时占用的房间数:

with datgen as 
  (select to_date('2008-09-19','yyyy-mm-dd')+(rownum-1)/24 d 
     from dual
     connect by rownum<=168)
select d, (select count(*) from room_usage
             where startdate<=datgen.d
               and enddate>=datgen.d) occupied
  from datgen;
Run Code Online (Sandbox Code Playgroud)

to_date('2008-09-19','yyyy-mm-dd')是查询的开始日期,168即您要报告的小时数.

编辑:要获得该数字的最大数量和最新日期,请使用

with datgen as 
  (select to_date('2008-09-19','yyyy-mm-dd')+(rownum-1)/24 d 
     from dual
     connect by rownum<=168),
occ_count as (     
  select d, (select count(*) from room_usage
               where startdate<=datgen.d
                 and enddate>=datgen.d) occupied
    from datgen)
select d, occupied from (select * from occ_count order by occupied desc, d desc)
 where rownum=1;
Run Code Online (Sandbox Code Playgroud)