0

我是 sql 查询的新手。表定义为

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

我需要找到给定日期范围内的每个符号,max(high)以及和min(low)的相应日期。max(high)min(low)

  • 可以在给定表中获取第一个最大日期和最小日期。
  • 在给定的日期范围内,某些日期可能会丢失。如果开始日期不存在,则应使用下一个日期,如果最后日期不存在,则应使用较早的可用日期

数据为一年和大约 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 回答