选择一行重复行,其中多列不同

时间:2016-07-22 05:02:01

标签: sql oracle

在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

3 个答案:

答案 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

这里我使用子查询,其中获取每个记录的行号,按val1val2对记录进行分区。然后我使用外部查询来仅过滤具有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来获取val1val2的先前值。然后在外部查询中,我选择第一条记录(由条件t.previousVal1 IS NULL and t.previousVal2 IS NULL指定)以及val1val2的值与前一条记录不同的所有记录。

答案 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)中的相同。