0

私はSQLクエリが初めてです。テーブルは次のように定義されます

(  symbol varchar,
   high int,
   low int,
   today date,
   Primary key (symbol, today)
)

特定の日付範囲の各シンボルと、 および の対応する日付を検索する必要max(high)min(low)ありmax(high)ますmin(low)

  • 指定されたテーブルで最初の最大日付と最小日付を取得できます。
  • 特定の日付範囲では、一部の日付が欠落している場合があります。開始日が存在しない場合は次の日付を使用する必要があり、最終日が存在しない場合は以前の利用可能な日付を使用する必要があります

データは 1 年間で、約 5000 シンボルです。

私はこのようなことを試しました

SELECT a.symbol,
       a.maxValue,
       a.maxdate,
       b.minValue,
       b.mindate
FROM (
    SELECT table1.symbol, max_a.maxValue, max_a.maxdate
    FROM table1
    INNER JOIN (
        SELECT table1.symbol,                            
               max(table1.high) AS maxValue, 
               table1.TODAY AS maxdate
        FROM table1
        GROUP BY table1.symbol
    ) AS max_a  
    ON max_a.symbol = table1.symbol
    AND table1.today = max_a.maxdate
) AS a  
INNER JOIN (
    SELECT symbol,
           min_b.minValue,
           min_b.mindate 
    FROM table1
    INNER JOIN (
        SELECT symbol,
               min(low) AS minValue, 
               table1.TODAY AS mindate
        FROM table1
        GROUP BY testnsebav.symbol
    ) AS min_b
    ON min_b.symbol = table1.symbol
    AND table1.today = min_b.mindate
) AS b
ON a.symbol = b.symbol
4

1 に答える 1

0

最初の INNER クエリは、指定された日付範囲内の最低値と最高値を各シンボルに対して事前に修飾します。その後、元のテーブルに再び結合します (同じ日付範囲の条件で) が、PreQuery の MIN() または MAX() と一致する低または高のいずれかの修飾子も追加します。その場合、結果セットで許可します。

さて、結果列です。使用している SQL のバージョンがわからないため、最初の 3 列を「最終」値として使用しています。その後の次の 3 つの列は、いずれかの修飾子によって修飾されたレコードから取得されます。株は常に上下するため、同じ期間内に高値または安値が複数回発生する可能性があります。これには、MIN() / MAX() 基準を満たすすべてのエントリが含まれます。

select
      PreQuery.Symbol,
      PreQuery.LowForSymbol,
      PreQuery.HighForSymbol,
      tFinal.Today as DateOfMatch,
      tFinal.Low as DateMatchLow,
      tFinal.High as DateMatchHigh
   from
      ( select
              t1.symbol,
              min( t1.low ) as LowForSymbol,
              max( t1.high ) as HighForSymbol
           from 
              table1 t1
           where
              t1.today between YourFromDateParameter and YourToDateParameter
           group by
             t1.symbol ) PreQuery
      JOIN table1 tFinal
         on PreQuery.Symbol = tFinal.Symbol
        AND tFinal.today between YourFromDateParameter and YourToDateParameter
        AND (   tFinal.Low = LowForSymbol
             OR tFinal.High = HighForSymbol )
于 2012-02-04T17:24:48.390 に答える