2013-02-25 97 views
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#

有沒有人有任何建議?

+0

你應該總是添加樣本數據和期望的輸出。否則,不容易明白你在找什麼...... – Art 2013-02-25 17:56:37

回答

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#是一個日期時間;如果它是一個字符串,你需要用適當的掩碼將它轉換爲日期。
+0

謝謝!那就是訣竅。 – user1557705 2013-02-26 09:15:39

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); 

這樣做,你被具有1行中的最接近記錄(時間)日期訂購G_RunningHoursEvent記錄。 使用其他SELECT,您只需提取此第1條記錄。