2016-07-22 16 views

答えて

2

あなたはあなたを助けるためにROW_NUMBERを使用することができます。ここでは

SELECT t.ID, t.val1, t.val2 FROM 
    (SELECT ID, val1, val2, ROW_NUMBER() 
     OVER (PARTITION BY val1, val2 ORDER BY ID) AS rownumber 
     FROM table1) t 
WHERE t.rownumber = 1 

私はval1val2でレコードを分割し、各レコードの行番号を取得するサブクエリを使用します。次に、外部クエリを使用して、必要な値を返すrownumber=1の行のみをフィルタリングします。

UPDATE:は、私はあなたが私の最初のクエリはID 8.

が含まれていないでしょう、あなたの期待された結果で同じ繰り返しの値(例えばIDが3と8の両方が結果に表示されなければならない)を、持つことができることを、気付きませんでしたここで

ちょうどあなたの期待される結果のような結果を与える代替ソリューションは、次のとおりです。

SELECT 
    t.ID, 
    t.val1, 
    t.val2 
FROM (
    SELECT 
     ID, 
     val1, 
     val2, 
     LAG(val1) OVER (ORDER BY ID) as previousVal1, 
     LAG(val2) OVER (ORDER BY ID) as previousVal2 
    FROM table1) t 
WHERE 
    (t.previousVal1 IS NULL and t.previousVal2 IS NULL) OR 
    t.val1 <> t.previousVal1 OR 
    t.val2 <> t.previousVal2 
ORDER BY t.ID 

ここでサブクエリで私はval1val2の以前の値を取得する機能LAGを使用。次に、外部クエリでは、最初のレコード(条件t.previousVal1 IS NULL and t.previousVal2 IS NULLで指定)と、val1val2の値が前のレコードと異なるすべてのレコードを選択します。

0

あなたは副選択

select ID, val1, val2 
from my_table 
where (id) in (select min(id) from my_table where (vali1, val2) in 
(select distinct val1,val2 from my_tbale)) 
0
SELECT DISTINCT first_value(ID) over (PARTITION BY val1, val2 ORDER BY ID), val1, val2 FROM your_tbl 

のペアを使用することができます。しかし、それはshurelyあなたが行与えることはありません(8、2、2)、val1とval2の行(3と同じであるため、 2、2)。