Извлечение подмножества данных с внутренним соединением с самим собой

У меня есть данные в следующем формате, и я хочу извлечь записи с годом = 2013, 2014 и 2015 для символа. (т.е. эти 3 года, а не 2, а не 4)

Первый ниже (FLWS) подходит, а следующий (FCCY) имеет только 2013 и 2014, но не 15, поэтому я не хочу, чтобы он был в конечном наборе. Далее в DDD и MMM есть данные с 2012 по 2105 год, и я просто хочу получить от них данные за 2013-15 годы.

Я не могу понять внутреннее соединение, необходимое для извлечения наборов из 3 записей для 2013, 14 и 15. Спасибо за любую помощь.

Symbol  Exchange    Date        Year
FLWS    NAS         2013-05-01  2015
FLWS    NAS         2013-05-01  2014
FLWS    NAS         2013-05-01  2013
FCCY    NAS         2013-05-01  2014
FCCY    NAS         2013-05-01  2013
SRCE    NAS         2013-05-01  2014
SRCE    NAS         2013-05-01  2013
SRCE    NAS         2013-05-01  2012
FNHC    NAS         2013-05-01  2014
FNHC    NAS         2013-05-01  2013
DDD     NYS         2013-05-01  2015
DDD     NYS         2013-05-01  2014
DDD     NYS         2013-05-01  2013
DDD     NYS         2013-05-01  2012
MMM     NYS         2013-05-01  2015
MMM     NYS         2013-05-01  2014
MMM     NYS         2013-05-01  2013
MMM     NYS         2013-05-01  2012
JOBS    NAS         2013-05-01  2014
JOBS    NAS         2013-05-01  2013

person Brian D    schedule 27.07.2016    source источник


Ответы (2)


кажется я понял ваш вопрос

Declare @Table table (Symbol varchar(25),Exchange varchar(25),Date Date,Year int)
Insert Into @Table (Symbol,Exchange,Date,Year) values
('FLWS','NAS','2013-05-01',2015),
('FLWS','NAS','2013-05-01',2014),
('FLWS','NAS','2013-05-01',2013),
('FCCY','NAS','2013-05-01',2014),
('FCCY','NAS','2013-05-01',2013),
('SRCE','NAS','2013-05-01',2014),
('SRCE','NAS','2013-05-01',2013),
('SRCE','NAS','2013-05-01',2012),
('FNHC','NAS','2013-05-01',2014),
('FNHC','NAS','2013-05-01',2013),
('DDD','NYS','2013-05-01',2015),
('DDD','NYS','2013-05-01',2014),
('DDD','NYS','2013-05-01',2013),
('DDD','NYS','2013-05-01',2012),
('MMM','NYS','2013-05-01',2015),
('MMM','NYS','2013-05-01',2014),
('MMM','NYS','2013-05-01',2013),
('MMM','NYS','2013-05-01',2012),
('JOBS','NAS','2013-05-01',2014),
('JOBS','NAS','2013-05-01',2013)

Select A.* 
 From @Table A
 Join (Select Symbol,Hits=count(Distinct Year),MinYear=min(Year) From @Table Group By Symbol) B on (A.Symbol=B.Symbol and B.Hits=3 and B.MinYear=2013)
 Order By Symbol,Year

Возвращает

Symbol  Exchange    Date        Year
FLWS    NAS         2013-05-01  2013
FLWS    NAS         2013-05-01  2014
FLWS    NAS         2013-05-01  2015
person John Cappelletti    schedule 27.07.2016
comment
Спасибо, Джон. Я пытаюсь получить все наборы из 3 штук, включая FLWS, SRCE, DDD и MMM. - person Brian D; 28.07.2016
comment
Я использую вашу основу здесь, чтобы помочь мне получить наборы из 3 - спасибо - person Brian D; 28.07.2016
comment
@BrianD Тогда просто удалите и B.MinYear=2013 ... Если я понимаю вашу цель. - person John Cappelletti; 28.07.2016
comment
Спасибо за ответ Джон - person Brian D; 28.07.2016

Это должно помочь: внутренний запрос просто перечислит символы, которые появляются в базе данных 3 раза. Внешний запрос будет использовать эти имена символов для выбора всех данных только для перечисленных символов.

select * from table
where symbol in ( select Symbol from table
where year in (2013, 2014, 2015)
group by symbol
having count (distinct year) = 3)
person Jenism    schedule 27.07.2016
comment
вам нужно count(distinct year) = 3 and year in (2013, 2014, 2015) для вашего внутреннего предложения where, но хороший ответ - person Bohemian♦; 27.07.2016
comment
Спасибо - то, что вы описали выше, - это то, что я хочу, но я получаю агрегат, который может не отображаться в сообщении об ошибке предложения WHERE. Работаю над этим сейчас - person Brian D; 27.07.2016
comment
это правда, вам нужно использовать с группой. см. отредактированный ответ - person Jenism; 27.07.2016
comment
Пожалуйста, отметьте ответ как правильный ответ, если это помогло вам - person Jenism; 28.07.2016