我正在研究旋转设备的报告申请。我们每3小时计算一次设备状态,并将计算结果存储在Oracle数据库中。
在报告之前只提供“当前状态”(我们只检索了最新的计算)。但现在用户可以选择及时回滚并查看之前的计算。
SELECT *
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#' AND
GRTE_ValuesUpdate IN (SELECT MAX(GRTE_ValuesUpdate)
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#')
SQL不是我最强的诉讼,大多数同事都在度假。我需要一些提示,说明如何提取最接近新变量#!VARIABLE_TIME#
有人有任何建议吗?
答案 0 :(得分:1)
如果我理解正确,用户将选择日期时间值,您需要选择最接近该时间的事件记录。
以下查询在子查询中做了一些魔术来建立最接近#!VARIABLE_TIME#
值的记录。
select
from g_runninghoursevent
where grte_tagname = '#!VARIABLE_TAGNAME#'
and grte_valuesupdate in
( select grte_valuesupdate
from ( with data as
( select grte_valuesupdate
, abs(grte_valuesupdate - #!VARIABLE_TIME#) tdiff
from g_runninghoursevent
where grte_tagname = '#!VARIABLE_TAGNAME#` )
select grte_valuesupdate
, rank() over (order by tdiff asc) rnk
from data )
where rnk = 1 )
备注强>
#!VARIABLE_TIME#
是日期时间;如果它是一个字符串,你需要将它用适当的掩码投射到一个日期。答案 1 :(得分:0)
此查询应解决您的问题:
SELECT *
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#' AND
TRUNC(GRTE_ValuesUpdate) = (SELECT TRUNC(GRTE_ValuesUpdate)
FROM (SELECT GRTE_ValuesUpdate
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#'
ORDER BY GRTE_ValuesUpdate DESC)
WHERE ROWNUM = 1);
执行此操作,您将按日期排序第一行中具有最接近记录(及时)的G_RunningHoursEvent记录。 使用另一个SELECT,您只需提取第一条记录。