SQL理论:在一列中过滤掉重复项,在其他列中选择最低值

时间:2016-11-03 16:04:22

标签: sql oracle greatest-n-per-group

我试图找出从结果集中删除行的最佳方法,其中一列中的值或另一列中的值在结果集中有重复。

想象一下查询的结果如下:

a_value | b_value
-----------------
   1    |   1
   2    |   1
   2    |   2
   3    |   1
   4    |   3
   5    |   2
   6    |   4
   6    |   5

我想做的是:

  • 消除a_value中具有重复值的所有行
  • 为给定的b_value选择仅一行

所以我希望在删除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以有效方式完成此任务的建议。

2 个答案:

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