在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
答案 0 :(得分: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
的行,该行返回您需要的值。
更新:我没有注意到,您可以在预期结果中使用相同的重复值(例如ID 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
的值与前一条记录不同的所有记录。
答案 1 :(得分: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))
答案 2 :(得分:0)
SELECT DISTINCT first_value(ID) over (PARTITION BY val1, val2 ORDER BY ID), val1, val2 FROM your_tbl
但它肯定不会给你一行(8,2,2),因为val1和val2与行(3,2,2)中的相同。