2016-07-22 21 views
0

在Oracle中是否有它可以在列val1和val2中選擇具有重複值的行的第一行?選擇具有多列的重複行的一行作爲區別

ID val1 val2 
================== 
1 1  1 
2 1  1 
3 2  2 
4 2  3 
5 2  3 
6 3  2 
7 3  2 
8 2  2 

Expect: 
ID val1 val2 
================== 
1 1  1 
3 2  2 
4 2  3 
6 3  2 
8 2  2 

回答

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的行,該行將返回所需的值。

更新:我沒有注意到,你可以在你預期的結果相同的重複值(例如編號3,8都應該顯示在結果),在我的初始查詢不包括ID 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 

在這裏,在子查詢我使用的功能LAG獲得的val1val2以前的值。然後在外部查詢中,我選擇第一條記錄(由條件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)。