使用 Distinct 获取重复值

Posted

技术标签:

【中文标题】使用 Distinct 获取重复值【英文标题】:Getting Duplicate Values With Distinct 【发布时间】:2015-11-03 07:03:39 【问题描述】:

您好,我正在使用此查询从具有不同参数的同一表中的数据中减去表中的值,但我得到了重复的值。谁能看到这里出了什么问题?

SELECT DISTINCT O.BMF_VOTE BMF_VOTE,
       O.BMF_OPERATING_AGENCY BMF_OPERATING_AGENCY,
       O.BGT_ACTUAL_EXPEND - S.BGT_ACTUAL_EXPEND ,
       O.BGT_PREV_ESTIMATE - S.BGT_PREV_ESTIMATE ,
       O.BGT_EST_YEAR1 - S.BGT_EST_YEAR1 ,
       O.BGT_EST_YEAR2 - S.BGT_EST_YEAR2 ,
       O.BGT_EST_YEAR3 - S.BGT_EST_YEAR3 
  FROM BGT_MOF_FROM O, BGT_MOF_FROM S
 WHERE (O.BMF_MAINDIVISION = '100' AND O.BMF_SUBDIVISION = '300')
       AND (S.BMF_SUBDIVISION = '220' AND S.BMF_MAINDIVISION = '100')

【问题讨论】:

提供样本数据。 【参考方案1】:

表上没有连接;那可能就是骗子的来源。使用子选择(下面别名为 O 和 S),加入 BMF_VOTE 和 BMF_OPERATING_AGENCY:

SELECT 
   O.BMF_VOTE, O.BMF_OPERATING_AGENCY,
   O.BGT_ACTUAL_EXPEND - S.BGT_ACTUAL_EXPEND ,
   O.BGT_PREV_ESTIMATE - S.BGT_PREV_ESTIMATE ,
   O.BGT_EST_YEAR1 - S.BGT_EST_YEAR1 ,
   O.BGT_EST_YEAR2 - S.BGT_EST_YEAR2 ,
   O.BGT_EST_YEAR3 - S.BGT_EST_YEAR3 
FROM 
  (
   SELECT * FROM BGT_MOF_FROM
   WHERE BMF_MAINDIVISION = '100' AND 
         BMF_SUBDIVISION = '300'
   ) O
  JOIN 
  (SELECT * FROM BGT_MOF_FROM
   WHERE BMF_SUBDIVISION = '220' AND 
         BMF_MAINDIVISION = '100' 
   ) S
   on 
   O.BMF_VOTE = S.BMF_VOTE and
   O.BMF_OPERATING_AGENCY =  S.BMF_OPERATING_AGENCY

修复你的代码:

SELECT DISTINCT O.BMF_VOTE BMF_VOTE,
   O.BMF_OPERATING_AGENCY BMF_OPERATING_AGENCY,
   O.BGT_ACTUAL_EXPEND - S.BGT_ACTUAL_EXPEND ,
   O.BGT_PREV_ESTIMATE - S.BGT_PREV_ESTIMATE ,
   O.BGT_EST_YEAR1 - S.BGT_EST_YEAR1 ,
   O.BGT_EST_YEAR2 - S.BGT_EST_YEAR2 ,
   O.BGT_EST_YEAR3 - S.BGT_EST_YEAR3 
FROM BGT_MOF_FROM O, BGT_MOF_FROM S
WHERE 
   (O.BMF_VOTE = S.BMF_VOTE and O.BMF_OPERATING_AGENCY =  S.BMF_OPERATING_AGENCY) 
   AND 
   (O.BMF_MAINDIVISION = '100' AND O.BMF_SUBDIVISION = '300')
   AND 
   (S.BMF_SUBDIVISION = '220' AND S.BMF_MAINDIVISION = '100')

【讨论】:

我从 Ed Baker 那里找到了一个没有连接的解决方案,但想测试你的学习方法,但是当我运行它时,我得到一个缺少关键字的错误。 等一下,我发现我没有更正一部分让我再试一次。 太好了,我也让它工作了。我只需要编辑表名并删除一个偷偷溜进去的额外括号。现在将尝试您的第二个代码。 它完美无缺。我会保存这两个,以便我可以向他们学习谢谢! 你对我的错别字很了解。我修复了表名和额外的)。乐意效劳。您可能会听说嵌套子选择很慢。我认为我们应该尽可能清楚并获得正确的结果。然后重写以优化,如果需要,确保我们得到相同的结果。祝你好运!【参考方案2】:

在我看来,您缺少两个表的任何连接子句,但不知道数据应该类似于:

FROM BGT_MOF_FROM O, BGT_MOF_FROM S
WHERE O.key = S.key

显然用实际的列名替换键。如果您正在尝试做一个半笛卡尔积(缓慢且糟糕),您应该将查询包装到子查询中,然后在其上运行 distinct。

【讨论】:

我现在因为没有注意到这一点而感到很愚蠢。我能感觉到缺少独特性,我不知道是什么。谢谢! 没问题,我完全明白!

以上是关于使用 Distinct 获取重复值的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB distinct() 指定字段去重

MySQL GROUP_CONCAT 返回重复值。无法使用 DISTINCT

distinct,消除重复用不了

distinct mysql过滤重复记录

distinct的使用

如何根据另一个变量的值使用 dplyr::Distinct