在24小时周期内获取最新活动

时间:2014-04-27 10:34:44

标签: sql time firebird firebird2.5

我有一张表get_today_events,其中显示了今天发生的事件。我需要创建一个视图,显示哪些事件是实际(这意味着当前时间介于实际事件和下一个事件之间,根据他们在eventtime中的时间每个scheduleid的列,而不考虑is_work列为N的事件。我遇到的问题是这个子查询中的条件:

select scheduleid
     , max(eventtime) as eventtime
from get_today_events
where cast(current_timestamp as time) >= eventtime
  and is_work = 'Y'
group by scheduleid

工作正常,直到current_timestamp介于00:00:0000:00:00之后的第一个事件之间 - 然后它什么都没有显示。我找到了correct solution,但我期待找到更短的方法来实现同样的目标。

第一次编辑

为了说清楚,我发布了一个包含 STD scheduleid的预期数据的示例。有五个时间间隔( TI 以下):

--------------------------------------------
scheduleid | eventname | eventtime | is_work
--------------------------------------------
   STD        Suspend    02:00:00       Y
   STD        Start      04:00:00       Y
   STD        Stop       05:00:00       Y
   STD        Suspend    19:00:00       Y
   STD        Start      02:00:00       Y
   STD        Stop       21:00:00       N
  • TI 02:00:00 和04:00:00之间(实际eventnameSuspend);
  • TI 04:00:00至05:00:00之间(实际eventnameStart);
  • TI 05:00:00至19:00:00之间(实际eventnameStop);
  • TI在19:00:00到 21:00:00 02:00:00 (实际eventnameStart);
  • TI在21:00:00到02:00:00之间(实际eventnameStop)。

1 个答案:

答案 0 :(得分:5)

您希望在24小时内获得最新活动。

MAX(CASE WHEN CURRENT_TIME >= EVENTTIME THEN EVENTTIME END)

给出CURRENT_TIME之前的最晚时间和NULL如果没有。

然后,您可以使用COALESCE将该NULL替换为午夜前的最后一个事件。

SELECT
    SCHEDULEID,
    COALESCE(MAX(CASE WHEN CURRENT_TIME >= EVENTTIME THEN EVENTTIME END),
             MAX(EVENTTIME)) as EVENTTIME
FROM GET_TODAY_EVENTS
WHERE IS_WORK = 'Y'
GROUP BY SCHEDULEID

如果您想了解这些事件的详细信息,可以JOIN使用原始表格。

SELECT mr.SCHEDULEID,mr.EVENTTIME,gte.EVENTTYPEID
  FROM
  (SELECT
      SCHEDULEID,
      COALESCE(MAX(CASE WHEN CURRENT_TIME >= EVENTTIME THEN EVENTTIME END),
               MAX(EVENTTIME)) as EVENTTIME
     FROM GET_TODAY_EVENTS
    WHERE IS_WORK = 'Y'
    GROUP BY SCHEDULEID) AS mr
 JOIN GET_TODAY_EVENTS gte 
   ON (gte.SCHEDULEID=mr.SCHEDULEID AND gte.EVENTTIME=mr.EVENTTIME)

SQLFiddle