我试图找出从结果集中删除行的最佳方法,其中一列中的值或另一列中的值在结果集中有重复。
想象一下查询的结果如下:
a_value | b_value
-----------------
1 | 1
2 | 1
2 | 2
3 | 1
4 | 3
5 | 2
6 | 4
6 | 5
我想做的是:
所以我希望在删除a_value重复后,过滤后的结果会像这样结束:
a_value | b_value
-----------------
1 | 1
3 | 1
4 | 3
5 | 2
然后在选择一个b_value之后再这样:
a_value | b_value
-----------------
1 | 1
4 | 3
5 | 2
我很欣赏有关如何通过SQL以有效方式完成此任务的建议。
答案 0 :(得分:1)
1)在内部查询中,我避免了a_value中存在的所有重复项 列并从输入表中获取所有剩余行并存储它们 如t2。通过将t2与t1连接,将存在完整数据,而没有任何重复 你需要的#1。
https://abcd.site.com/api/Service.svc/authenticate
2)一旦获得过滤后的数据,我就会为步骤1中获得的过滤数据集中的每一行分配排名,而我只选择排名为1的行。
SELECT t1.*
FROM Table t1,
(
SELECT a_value
FROM Table
GROUP BY a_value
HAVING COUNT(*) = 1
) t2
WHERE t1.a_value = t2.a_value;
答案 1 :(得分:1)
with
q_res ( a_value, b_value ) as (
select 1, 1 from dual union all
select 2, 1 from dual union all
select 2, 2 from dual union all
select 3, 1 from dual union all
select 4, 3 from dual union all
select 5, 2 from dual union all
select 6, 4 from dual union all
select 6, 5 from dual
)
-- end test data; solution begins below
select min(a_value) as a_value, b_value
from (
select a_value, min(b_value) as b_value
from q_res
group by a_value
having count(*) = 1
)
group by b_value
order by a_value -- ORDER BY is optional
;
A_VALUE B_VALUE
------- -------
1 1
4 3
5 2