Как сделать само присоединение на мин / макс - PullRequest
0 голосов
/ 04 февраля 2012

Я новичок в 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

1 Ответ

0 голосов
/ 04 февраля 2012

Первый запрос INNER предварительно определяет для каждого символа, какие низкие и высокие значения находятся в указанном диапазоне дат.После этого он снова присоединяется к исходной таблице (для тех же критериев диапазона дат), но также добавляет квалификатор, который ЛИБО низкий или высокий соответствует MIN () или MAX () из PreQuery.Если это так, разрешите это в наборе результатов.

Теперь столбцы результатов.Не зная, какую версию 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 )
...