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

时间:2011-09-19 06:35:31

标签: sql oracle

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

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

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

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

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

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

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

任何建议表示赞赏!

1 个答案:

答案 0 :(得分:5)

假设有这样的数据结构:

create table room_usage ( 
   roomnumber number(6),
   occupied_by varchar2(20),
   startdate date,
   enddate date
);

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

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;

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;