2009-07-17 9 views
1

J'ai un ensemble d'enregistrements de stock.Sélection SQL excluant certaines plages

J'ai également un ensemble de dates pour lesquelles, même si je pourrais avoir des données, je ne peux pas négocier des actions.

voici l'exemple pour la configuration DDL:

create table #stock_data 
(
    symbol varchar (10) NOT NULL, 
    asof datetime NOT NULL, 
    price float NOT NULL 
) 
go 

insert into #stock_data values ('IBM', '7/1/09', 100) 
insert into #stock_data values ('IBM', '7/2/09', 100) 
insert into #stock_data values ('IBM', '7/3/09', 100) 
insert into #stock_data values ('IBM', '7/4/09', 100) 
insert into #stock_data values ('IBM', '7/5/09', 100) 
insert into #stock_data values ('IBM', '7/6/09', 100) 
insert into #stock_data values ('IBM', '7/7/09', 100) 
insert into #stock_data values ('IBM', '7/8/09', 100) 
insert into #stock_data values ('IBM', '7/9/09', 100) 

insert into #stock_data values ('MSFT', '7/1/09', 50) 
insert into #stock_data values ('MSFT', '7/2/09', 50) 
insert into #stock_data values ('MSFT', '7/3/09', 50) 
insert into #stock_data values ('MSFT', '7/4/09', 50) 
insert into #stock_data values ('MSFT', '7/5/09', 50) 
insert into #stock_data values ('MSFT', '7/6/09', 50) 
insert into #stock_data values ('MSFT', '7/7/09', 50) 
insert into #stock_data values ('MSFT', '7/8/09', 50) 
insert into #stock_data values ('MSFT', '7/9/09', 50) 
go 

create table #exclude_ranges 
(
    symbol varchar (10) NOT NULL, 
    asof_start datetime NOT NULL, 
    asof_end datetime NOT NULL 
) 
go 


insert into #exclude_ranges values ('IBM', '7/2/09', '7/2/09') 
insert into #exclude_ranges values ('IBM', '7/6/09', '7/8/09') 
insert into #exclude_ranges values ('MSFT', '7/1/09', '7/8/09') 

go 

Et voici le SELECT que je veux. Je sais qu'il doit y avoir une façon intelligente de le faire, mais je ne peux pas comprendre tout à fait dehors .....

select * from #stock_data 
join ???? 
where ???? 

pour revenir

('IBM', '7/1/09', 100) 
('IBM', '7/3/09', 100) 
('IBM', '7/4/09', 100) 
('IBM', '7/5/09', 100) 
('IBM', '7/9/09', 100) 
('MSFT', '7/9/09', 50) 

Alors, que la magie va dans le? ??? des blocs?

Répondre

5
SELECT * 
FROM #stock_data sd 
LEFT JOIN #exclude_ranges er 
    ON sd.symbol=er.symbol and sd.asof BETWEEN er.asof_start AND er.asof_end 
WHERE er.symbol IS NULL 
+1

Heh, je creuse la logique en arrière de cette requête. Joignez les entrées exclues dans les entrées qu'ils excluent, puis prenez ce qui reste. – Dave

+0

Génial. Jointure externe FTW! –

1

Try this ...

select * from stock_data s 
left join exclude_ranges e 
    on e.symbol = s.symbol 
    and s.asof between e.asof_start and e.asof_end 
Where e.symbol is null 
Questions connexes