在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
在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
您可以使用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
這裏我用一個子查詢,其中一個得到每個記錄的行號,由val1
和val2
分割記錄。然後,我使用外部查詢來僅篩選具有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
獲得的val1
和val2
以前的值。然後在外部查詢中,我選擇第一條記錄(由條件t.previousVal1 IS NULL and t.previousVal2 IS NULL
指定)和val1
和val2
的值與先前記錄不同的所有記錄。
您可以用一雙子查詢
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))
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)。