0

我正在研究旋转设备的报告应用程序。我们每 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#

有人有什么建议吗?

4

2 回答 2

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 )

笔记

  • ABS() 调用意味着子查询将在输入参数之前或之后返回差异最小的记录。
  • 子查询使用 IN 而不是相等,因为您可能会因为最小的差异而打成平手
  • 我假设#!VARIABLE_TIME#是一个日期时间;如果它是一个字符串,则需要使用适当的掩码将其转换为日期。
于 2013-02-25T10:41:21.040 回答
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,您只需提取第一条记录。

于 2013-02-25T09:09:34.343 回答