我有一张表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:00
和00: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
eventname
为Suspend
); eventname
为Start
); eventname
为Stop
); eventname
为Start
); eventname
为Stop
)。答案 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)