Sql 选择一行重复的行,其中多列是不同的
在Oracle中,是否仍然可以选择列val1和val2中具有重复值的行的第一行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
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行相同