2

製品、日付/時刻、および価格が記載されたテーブルがあります。日付/時刻を別の列に分割し、時間の部分を分割しました。時間ごとに価格値の高値/安値/始値/終値を見つける必要があります。max()/ min()の選択部分で副選択を実行し、製品と時間でデータを結合することで、高/低を簡単に取得できます。ここで、1時間ごとの最初のレコードと、1時間ごとの最後のレコードとなるオープン/クローズが必要です。高/低/開/閉は、時間ごとに各レコードですべて同じである必要があります。

結果の例。すべての時間7レコードの最高値が55であることに注意してください。これは、すべての時間7レコードに配置されたものです。最低値は、すべての時間7レコードの最低値であるため、30です。最初の価格(日付/時刻でソート)により、50がオープンです。 7:15)は50です。終値は30である日付/時刻でソートされた時間の最後の価格です。

Product, Date,            Hour, Price, High, Low, Open, Close
A,       11/12/2012 7:15, 7,    50,    55,   30,  50,   30
A,       11/12/2012 7:28, 7,    55,    55,   30,  50,   30
A,       11/12/2012 7:30, 7,    40,    55,   30,  50,   30
A,       11/12/2012 7:35, 7,    45,    55,   30,  50,   30
A,       11/12/2012 7:55, 7,    30,    55,   30,  50,   30

要約すると、高/低は、最大/最小を実行して同じテーブルに対してクエリを実行する選択部分で副選択を行うので簡単ですが、最初と最後のレコードをベースにするために開閉に対して同じことを行う方法がわかりません日付/時刻フィールド。

4

2 に答える 2

0

私はこれにランキング関数を使用します:

select product, datestr, hour,
       max(case when seqnum_open = 1 then price end) as Open,
       max(case when seqnum_close = 1 then price end) as Close,
       max(price) as High,
       min(price) as Low
from (select t.*,
             row_number() over (partition by product, datestr, hour order by date) as seqnum_open,
             row_number() over (partition by product, datestr, hour order by date desc) as seqnum_close
      from (select t.*,
                   to_char(date, 'YYYY-MM-DD') as datestr
            from t
           ) t
     ) t
group by product, datestr, hour
于 2012-11-12T21:01:51.143 に答える
0

これをサブクエリとして追加して Open を取得し、プロダクト キーと時間を適切に置き換えます。

SELECT * FROM (
  Select Open
  FROM <table name>
  WHERE product = '<product key>' 
    AND hour='<the hour>'
  ORDER BY Date
) WHERE rownum = 1

これをサブクエリとして追加して Close を取得し、プロダクト キーと時間を適切に置き換えます。

SELECT * FROM (
  Select Close
  FROM <table name>
  WHERE product = '<product key>' 
    AND hour='<the hour>' 
  ORDER BY Date desc
) WHERE rownum = 1

ここでのコツは、結果の順序を正しく設定し、 を使用して最初の結果のみを取得することrownum = 1です。


別のオプション:

SELECT Open
FROM <table name>
WHERE product = '<product key>' 
  AND hour='<the hour>' 
  AND Date = (
    SELECT min(Date) 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>'
    ) 

SELECT Close
FROM <table name>
WHERE product = '<product key>' 
  AND hour='<the hour>' 
  AND Date = (
    SELECT max(Date) 
    FROM <table name> 
    WHERE product = '<product key>' 
    AND hour='<the hour>'
    ) 

このルートの欠点は、これらのステートメントが 1 つの行を返すことが保証されていないことです。つまり、特定の製品に同じ時間に 2 つのエントリがあり、同じ Date 値が最小/最大である場合、サブクエリとして使用すると例外が発生する 2 つの行が返されます。

これは良いことかもしれませんが、恣意的に行を選択するのではなく、特定の問題があることがわかり、クエリを更新してよりインテリジェントな決定を下せる可能性があります。

于 2012-11-12T20:27:42.883 に答える