-1

私は2つのテーブルを持っています。STOCK_HIST には、値 (PRHIGH) の時系列 (DSEQKEY) が含まれています。もう 1 つのテーブル (PHASE_KEYS_D) には、PHASE_KEYS_D.BEGKEY から PHASE_KEYS_D.ENDKEY によってマークされた STOCK_HIST のさまざまな期間を表す STOCK_HIST の開始キーと終了キーが含まれています。PHASE_KEYS_D の各行の BEGKEY と ENDKEY の間の STOCK_HIST で最高の PRHIGH を返すクエリを機能させようとしています。私は次のことを試しましたが、常に本来あるべきものが返されるとは限りません。

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

助けてくれてありがとう!

4

1 に答える 1

1

ここでの問題の 1 つは、どちらのテーブル、特に PHASE_KEYS_D テーブルにも主キーがないことです。ほとんどの場合、すべてのテーブルに主キーを設定し、できれば非インテリジェント キーを設定することをお勧めします (つまり、テーブルにはデータが表示されず、ただの ID です)。

これは、主キーがある場合にクエリがどれほど簡単になるかです。

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

そして、各詳細行で最大値を表示したい場合:

;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
于 2013-09-01T04:31:09.913 に答える