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 レコードが日付順に並べられ、1 番目の行に (時間的に) 最も近いレコードが表示されます。他の SELECT では、この最初のレコードを抽出するだけです。

于 2013-02-25T09:09:34.343 に答える