SQL 理论:过滤掉一列中的重复项,选择另一列中的最低值

SQL theory: Filtering out duplicates in one column, picking lowest value in other column

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

假设查询的结果如下:

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.

以高效方式完成此任务的建议,我将不胜感激

1) 在内部查询中,我避免了 a_value 中存在的所有重复项 列并从输入 table 中获取所有剩余行并存储它们
作为 t2。通过将 t2 与 t1 连接起来,将会有完整的数据,没有任何重复 您的需求排名第一。

 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; 

2) 获得过滤后的数据后,我将为步骤 1 中获得的过滤数据集中的每一行分配排名,并且我只选择排名为 1 的行。

SELECT X.a_value,
       X.b_value
  FROM
     (
        SELECT t1.*,
               ROW_NUMBER() OVER ( PARTITION BY t1.b_value ORDER BY t1.a_value,t1.b_value ) AS rn 
          FROM Table t1,
             (
               SELECT a_value       
                 FROM Table 
                GROUP BY a_value
               HAVING COUNT(*) = 1
              ) t2
         WHERE t1.a_value = t2.a_value 
       ) X
WHERE X.rn = 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