首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL理论:在一列中筛选出重复项,在另一列中选择最低值

问SQL理论:在一列中筛选出重复项,在另一列中选择最低值
EN

Stack Overflow用户
提问于 2016-11-03 16:04:22
回答 2查看 142关注 0票数 1

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

假设查询的结果如下:

代码语言:javascript
复制
a_value | b_value
-----------------
   1    |   1
   2    |   1
   2    |   2
   3    |   1
   4    |   3
   5    |   2
   6    |   4
   6    |   5

我想做的是:

  • 删除a_value中具有重复值的所有行
  • 只为给定的b_value选择1行

因此,我希望在消除a_value重复之后,过滤的结果会像这样结束:

代码语言:javascript
复制
a_value | b_value
-----------------
   1    |   1
   3    |   1
   4    |   3
   5    |   2

然后在只选择一个b_value之后,就像这样:

代码语言:javascript
复制
a_value | b_value
-----------------
   1    |   1
   4    |   3
   5    |   2

对于如何通过SQL高效地完成这项任务,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-03 16:33:40

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-11-03 16:18:45

1)在内部查询中,我避免了a_value列中存在的所有重复项,并从输入表中获取所有剩余的行并存储它们。

代码语言:javascript
复制
as t2. By joining t2 with t1 there would be full data without any dups as per     your #1 in requirement.
代码语言:javascript
复制
 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中获得的过滤数据集中的每一行进行排序,并且只选择带有rank=1的行。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40406237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档