2015-07-17 2 views
0

Как написать SQL-запрос, который будет выбирать последнюю рекомендацию от каждого аналитика для каждого запаса, как известно в определенную дату (например, 1/1/10). Например, если аналитик имеет несколько рейтингов, но max (rating_date) больше указанной даты, он все равно должен вернуть рейтинг на максимальную дату меньше указанной даты. Итак, в приведенном ниже случае в указанную дату 1/1/10 я все равно должен получить рейтинг для Джона от 6/9/09, а также значение для Смита по состоянию на 12/5/09.SQL-запрос с несколькими критериями

Вот структура данных:

Stock_Ticker, Analyst_Name, Rating_Date, Rating_Name 

G,    John,   6/9/09,  Hold 

G,    John,   1/20/10,  Sell 

G,    Smith,   12/5/09,  Buy 

Если я пытаюсь что-то вроде ниже SQL, я получаю только значение, если максимальная дата меньше указанной даты.

Select Analyst_Ratings.Stock_Ticker, 
     Analyst_Ratings.Analyst_Name, 
     Analyst_Ratings.Rating_Name 
From Analyst_Ratings 
Where Rating_Date In(
    Select Max(Rating_Date) 
    From Analyst_Ratings 
    Where Rating_date <= '2010-01-01') 
+0

указать 'группу by' условия в вашем внутреннем запросе. –

ответ

2
Select Analyst_Ratings.Stock_Ticker, 
    Analyst_Ratings.Analyst_Name, 
    Analyst_Ratings.Rating_Name 
From Analyst_Ratings 
Where Rating_Date In(
Select Max(Rating_Date) 
From Analyst_Ratings 
group by stock_ticker, analyst_name 
Where Rating_date <= '2010-01-01') 

Попробуйте

+0

@Michael @vkp У этого есть недостаток: это не даст вам окончательный рейтинг * за аналитика за акцию *. Это даст вам все рейтинги, которые имеют один и тот же рейтинг «rating_date» в качестве последнего рейтинга для любого * аналитика, * любого * запаса. Вы не «коррелируете» подзапрос с основным запросом. –

0

Это использует синтаксис T-SQL, но идея должна получить вас начали:

Select ar.Stock_Ticker, 
     ar.Analyst_Name, 
     ar.Rating_Name, 
     ar.Rating_Date 
From Analyst_Ratings ar 
    Inner Join (
     select ar2.Stock_Ticker 
      , ar2.Analyst_Name 
      , Max(ar2.Rating_Date) as Last_Rating_Date 
     from Analyst_Ratings ar2 
     where ar2.Rating_Date <= '2010-01-01') 
     group by 
       ar2.STock_Ticker 
      , ar2.Analyst_Name 
    ) as Last_Ratings lr 
    on ar.Stock_Ticker = lr.Stock_Ticker 
    and ar.Analyst_Name = lr.Analyst_Name 
    and ar.Rating_Date = lr.Last_Rating_Date