2014-02-26 1 views
0

내 목표는 몇 달 동안 매일 저장되는 주식형 기호 (Cusips)를 찾는 것입니다.SQL Server - CTE - 재귀에서 교차 사용

나는 historydate 날짜 기호 문자로 열이있는 역사 테이블을했습니다 (100)

, 즉 가능한 내 목표는 문자의 목록을 찾을 수 있습니다

입니다 첫날부터 모든 날짜하는 우리 2013-01-01으로 가정합니다.

각 날짜마다 1000 개의 기호가있을 수 있으며 2013-01-01에서 마지막 날짜까지 보유중인 주식 기호 만 찾으면됩니다.

나는 다음과 같이 시도했지만 작동하지 않았다.

WITH asset_data_cte(cusip) 
    AS (SELECT DISTINCT cusip 
     FROM dbo.asset_data 
     WHERE t = '20130101' 
     UNION ALL 
     SELECT orig.cusip 
     FROM dbo.asset_data orig 
       INNER JOIN asset_data_cte adc 
         ON orig.cusip = adc.cusip 
         AND orig.t != adc.t) 
SELECT * 
FROM asset_data_cte 

이것은 내가 정말로 원했던 것을 만들어 내지 못했습니다. 확실하지, 내 질문에 대한 답변을 얻는 가장 좋은 방법.

답변

3

다음은 더 간단한 쿼리입니다. @startdate@enddate (포함) 사이에 각 날짜의 레코드가 있는지 확인합니다. 그것은 그룹화를 사용하고 날짜 사이의 일 수와 동일한 수를 확인합니다.

declare @startdate date, @enddate date 
set @startdate = '20140101' 
set @enddate = '20140103' 

select cusip 
from asset_data 
where t >= @startdate and t <= @enddate 
group by cusip 
having count(distinct t) = datediff(d, @startdate, @enddate) + 1 

SQL Fiddle demo