2017-06-14 18 views
0

に関連付けられた値に引き上げ、私は、次の列を持つテーブルがあると:SQL:凝集

ID1、ID2、各ID1の値

を、複数のID2と対応する値が存在することができる、すなわち:

a,1,5 
a,2,6 
a,3,7 

Edit: Simpler version of ask: 
How can I pull ID1, Max(ID2), Value without having to group on value (i want 
to pull the value that corresponds to the max(id2) and without having to do a second join. 

私は以下のことを提供するための方法を把握しようとしている: ID1、MIN(ID2)、マックス(ID2)、最小/最大ID2に関連付けられている値と一緒に:

私が作ってみた、1,3,5,7-

唯一の方法は、の線に沿って何かである:

select 
a.id1, a.min_id2, a.max_id2, b.value as min_value, c.value as max_value 
from (select id1, min(id2) as min_id2, max(id2) as max_id2) from table group by 1) a 
left outer join (select id1, id2, value from table) b on a.min_id2 = b.id2 
left outer join (select id1, id2, value from table) c on a.max_id2 = c.id2 

これは架空の例ですが、私のデータでこれを実行すると、取り非常に長いイム。私が気付いていないようなショートカットがあるかもしれないと思っていた。

答えて

1

あなたは、単一の行に最大/最小の両方が必要な場合(説明が、すべては、単一のステップで計算されます)を使用すると、複数のOLAP関数を使用することができます。

SELECT t.*, 
    -- max id2 
    Max(id2) Over (PARTITION BY id1), 
    -- and corresponding value 
    Last_Value(value) 
    Over (PARTITION BY id1 
     ORDER BY id2 
     ROWS BETWEEN Unbounded Preceding AND Unbounded Following) 
FROM table AS t 
QUALIFY -- row with min id2 
    Row_Number() 
    Over (PARTITION BY id1 
     ORDER BY id2) = 1 
関連する問題