2013-08-31 2 views
-1

У меня есть две таблицы. STOCK_HIST содержит временную последовательность (DSEQKEY) значений (PRHIGH). В другой таблице (PHASE_KEYS_D) содержатся начальные и конечные ключи для STOCK_HIST, представляющие различные периоды времени в STOCK_HIST, отмеченные PHASE_KEYS_D.BEGKEY через PHASE_KEYS_D.ENDKEY. Я пытаюсь получить работу запроса, которая вернет самую высокую PRHIGH в STOCK_HIST между BEGKEY и ENDKEY каждой строки в PHASE_KEYS_D. Я пробовал следующее, но он не всегда возвращает то, что нужно.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

изменить название на что-то осмысленный. –

ответ

1

Одна из ваших проблем заключается в том, что ни таблица, и особенно таблица PHASE_KEYS_D, не имеют первичных ключей. Почти всегда хорошая идея для всех таблиц иметь первичный ключ и, желательно, неинтеллектуальные ключи (это означает, что в них нет данных, они просто тупые идентификаторы).

Это как прямой запрос становится, когда у вас есть первичный ключ:

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 
+0

sisdog спасибо. Второй пример очень близок к тому, что я ищу. Мы можем рассматривать begkey как первичный ключ для фаз_keys_d и dseqkey в качестве первичного ключа для Stock_hist. Мне нужно вернуть одну строку с тремя столбцами для каждого шага в фазе_keys_d: 1) начальное поле из фаз_keys_d (у вас есть этот столбец как фаза_ид выше), 2) значение max (stock_hist.prhigh) и 3) одиночная dseqkey (stock_hist), в котором произошло max (prhigh). В очередной раз благодарим за помощь. –

Смежные вопросы