我有一个表get_today_events,该表显示了今天正在发生的事件。我需要为每个eventtime
创建一个 View ,以显示哪些事件是实际事件(这意味着当前时间在实际事件和下一个事件之间,根据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 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
)。 最佳答案
您要获取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
关于sql - 获取24小时周期内的最新事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23322278/