Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择一行重复的行,其中多列是不同的_Sql_Oracle - Fatal编程技术网

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

Sql 选择一行重复的行,其中多列是不同的,sql,oracle,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

在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
您可以使用来帮助您:

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
在这里,我使用一个子查询,其中a为每个记录获取一个行号,并按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
在这里的子查询中,我使用这个函数来获取先前的值val1和val2。然后,在外部查询中,我选择由条件t.previousVal1为NULL、t.previousVal2为NULL指定的第一条记录,以及val1和val2值与前一条记录不同的所有记录。

您可以使用这些记录来帮助您:

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
在这里,我使用一个子查询,其中a为每个记录获取一个行号,并按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

在这里的子查询中,我使用这个函数来获取先前的值val1和val2。然后在外部查询中,我选择由条件t.previousVal1为NULL,t.previousVal2为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))

您可以使用一对subselect

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))
但它不会给出第8、2、2行,因为val1和val2与第3、2、2行相同

但它不会给出第8、2、2行,因为val1和val2与第3、2、2行相同