【问题标题】:How do I return the lowest value in one field, eliminating duplicates based on another?如何返回一个字段中的最小值,消除基于另一个字段的重复项?
【发布时间】:2019-07-22 13:31:42
【问题描述】:

所以,对于 Access 2016 / SQL 来说非常新。我正在尝试制作以下数据集:

需要:

这里的逻辑是,我需要在每个零售商中找到尺寸必须大于 999 的每种产品的最低 TCO。请有人帮我解释一下。

谢谢,

更新:基于 cmets,我更新了需求并简化了数据 :)

原始数据:enter image description here

预期数据:enter image description here

【问题讨论】:

  • 如果有人用更新标准的精确解决方案更新他们的答案,那是他们的特权。然而,一个传统一直是一个很好的问题 1)从一开始就概述了所有标准,并且 2)包括一个尝试性的解决方案,显示您自己的研究和理解的努力。既然答案已经为您提供了一个很好的可行解决方案示例,您应该真正尝试了解细节并自己制定最终解决方案。
  • 对于它的价值,我建议采用 apomene 的解决方案并更新标准(即 WHERE 子句)并根据您期望的结果添加额外的聚合列。见support.office.com/en-us/article/…
  • 感谢 C Perkins。是的 - 我试图详细地问这个问题,但你很快意识到什么对你有意义,对其他人没有意义,即使你认为你包含了所有事实,但你没有!谢谢大家

标签: sql ms-access


【解决方案1】:

使用group bymin 喜欢:

    SELECT Product,Retailer,MIN(CTO) from myTable 
     where size>999 GROUP BY Product,Retailer

【讨论】:

  • 这看起来有效!谢谢你。还有两件事,如果我有另一个类似于 SIZE 的变量,我是否只需使用 & 命令并将其放入?例如。 “其中尺寸>999 & 重量>500”?我确实尝试过,但返回的结果不正确。我还需要我的最终表格来显示 SIZE 结果,所以在上面的示例中,它显示它是 1000。
  • AND 是 SQL 中正确的逻辑运算符。运算符 & 在 Access 中的 VBA 中执行字符串连接。
  • 如何在不影响计算的情况下添加我需要的额外信息?我想在我的表格输出中查看大小(和新字段重量)。
  • 什么是重量?现在你有更多列了吗?
  • sorry 是的,代码里基本一样:WHERE (((Table2.size)>19999) AND ((Table2.weight)
【解决方案2】:

如果你想要结果中的所有列,那么你可以使用NOT EXISTS:

select
  t.*
from tablename t
where 
  t.size > 999
  and
  not exists (
    select 1 from tablename
    where product = t.product and retailer = t.retailer and size > 999 and tco < t.tco
  )

【讨论】:

  • 这里的关键区别不一定是它返回“所有列”,因为其他答案可以用MIN(size) 之类的东西更新以返回所有列。相反,此查询可能会返回在条件列中具有重叠值的多行。换句话说,它将返回与条件匹配的所有行,而具有聚合结果的另一个答案将为每组唯一标准值返回仅一行。如果从不存在“重叠”行,则结果是相同的。否则,这些将返回不同数量的行。
  • 此查询可能会返回多行正确,我相信它应该(如果有多行)因为没有条件将结果限制为每个只有 1 行情况,因为还有 size 列可能会有所不同。如果预期结果不包含列大小,则仅group by product, retailer 就足够了。
  • 我的评论主要针对 OP,因为他们表示它们是“非常新的”。我发现这通常表明他们不完全理解聚合、过滤数据集等的概念。如果他们用过于简单的数据测试两个答案,或者只是天真地假设两个答案是等价的,那么他们可能会感到沮丧后来结果不是他们所期望的。问题中缺乏条件,特别是对于新手来说,并不表示“应该”是什么。这不是您“认为应该”是什么的问题,而是 OP 需要决定这一点。
  • 我同意。 OP 将尝试这里提出的解决方案,我希望结果的差异能让他们清楚地知道要求没有完全阐明。
  • @BenThompson 您的示例数据不包含像 CPrekins 提供的示例那样的行。但如果它确实包含了你期望的结果呢?
【解决方案3】:

我会使用相关子查询:

select t.*
from t
where t.size > 999 and
      t.tco = (select min(t2.tco)
               from t as t2
               where t2.product = t.product and
                     t2.retailer = t.retailer and
                     t2.size > 999
              );

【讨论】:

  • @CPerkins 。 . .是的。问题是要求最低限度。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2020-09-06
  • 2015-04-09
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多