2012-02-04 2 views
0

Я новичок в запросах sql. Таблица определяется какКак сделать самостоятельное соединение на min/max

( 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

который sql-сервер ... SQL-Server, MySQL, ... – DRapp

+0

Что мы 'testnsebav.symbol'? –

ответ

0

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

Теперь столбцы результатов. Не зная, какую версию SQL вы использовали, у меня есть первые 3 столбца в качестве «окончательных» значений. Следующие 3 столбца после этого взяты из записи, которая была квалифицирована ETERER из квалификаторов. По мере того, как акции постоянно растут и убывают, возможно, что высокие и/или низкие значения происходят более одного раза в течение одного и того же периода времени. Это будет включать ВСЕ те записи, которые соответствуют критериям 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^