-1

我有两张桌子。STOCK_HIST 包含值 (PRHIGH) 的时间序列 (DSEQKEY)。另一个表 (PHASE_KEYS_D) 包含 STOCK_HIST 的开始和结束键,表示 STOCK_HIST 中由 PHASE_KEYS_D.BEGKEY 到 PHASE_KEYS_D.ENDKEY 标记的各个时间段。我试图让一个查询工作,它将在 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

您的问题之一是这两个表,尤其是 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 回答