我正在做一个旋转设备的报告申请。我们每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#
的最新计算的技巧
有没有人有什么建议?
发布于 2013-02-25 10:41:21
如果我理解正确,用户将选择一个日期时间值,而您需要选择最接近该时间的事件记录。
下面的查询在子查询中使用了一些魔术,以建立最接近#!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#
是一个datetime;如果它是一个字符串,则需要将其转换为具有适当掩码的日期。发布于 2013-02-25 09:09:34
这个查询应该可以解决您的问题:
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,您只需提取这第一条记录。
https://stackoverflow.com/questions/15063376
复制