2013-08-31 1 views
-1

두 테이블이 있습니다. STOCK_HIST는 값의 시간 순서 (DSEQKEY)를 포함합니다 (PRHIGH). 다른 테이블 (PHASE_KEYS_D)에는 PHASE_KEYS_D.BEGKEY ~ PHASE_KEYS_D.ENDKEY로 표시된 STOCK_HIST의 다양한 기간을 나타내는 STOCK_HIST의 시작 및 종료 키가 들어 있습니다. PHY_KEYS_D의 각 행의 BEGKEY와 ENDKEY 사이의 STOCK_HIST에서 가장 높은 PRHIGH를 반환하는 쿼리를 얻으려고합니다. 나는 다음을 시도했지만 그것이 항상 필요한 것을 반환하지는 않는다.SQL Server 2008 R2 - 높은 범위를 반환하는 하위 쿼리

select dseqkey,prhigh 
from STOCK_HIST 
where prhigh in 
    (
    select max(prhigh) 
    from STOCK_HIST A, PHASE_KEYS_D B 
    where a.dseqkey between b.begkey and b.endkey 
    group by b.begkey 
    ) 
order by dseqkey desc 


CREATE TABLE STOCK_HIST (DSEQKEY INT, PRHIGH MONEY) 
DSEQKEY  PRHIGH 
1  1432.22 
2  1433.10 
3  1435.55 
4  1440.21 
5  1422.20 
6  1415.10 
7  1401.99 
8  1433.10 

CREATE TABLE PHASE_KEYS_D (BEGKEY INT, ENDKEY INT) 
BEGKEY  ENDKEY  
1  3 
4  5 
6  8 

미리 도움을 청하십시오!

+2

변경 뭔가 제목 :

alter table phase_keys_id add phase_id int not null identity (1,1) select p.phase_id,max(h.prhigh) from phase_keys_d p inner join stock_hist h on h.DSEQKEY between p.BEGKEY and p.ENDKEY group by p.phase_id 

을 그리고 각 세부 행에 최대를 보여주고 싶었다 경우 의미있는. –

답변

1

여기서 문제는 테이블 및 특히 PHASE_KEYS_D 테이블에 기본 키가 없다는 것입니다. 모든 테이블에는 기본 키가 있고 지능형이 아닌 키가있는 것이 좋습니다. 데이터가 없다는 것을 의미합니다. 단지 멍청한 ID입니다.

이것은 기본 키가있을 때 앞으로 쿼리가 될 방법 직선 :

;with z as (
select h.dseqkey,p.phase_id,h.prhigh 
from 
    phase_keys_d p 
    inner join stock_hist h on h.DSEQKEY between p.BEGKEY and p.ENDKEY 
) 
select 
    z.dseqkey, z.prhigh, y.mx 
from 
    z 
    inner join (select phase_id,mx=max(prhigh) from z group by phase_id) y 
    on y.phase_id = z.phase_id 
+0

감사합니다. 두 번째 예제는 내가 찾고있는 것과 매우 가깝습니다. 우리는 begkey를 stock_hist의 기본 키로 phase_keys_d 및 dseqkey의 기본 키로 간주 할 수 있습니다. 내가 phase_keys_d에있는 각 begkey에 대해 3 개의 열을 가진 하나의 행을 리턴 할 필요가있다 : 1) phase_keys_d의 begkey (위의 phase_id와 같은 열), 2) max (stock_hist.prhigh) 값과 3) 하나의 dseqkey (stock_hist)에서 max (prhigh)가 발생했습니다. 도와 줘서 고마워. –

관련 문제