【问题标题】:Select Top Row in a Group By without any numerical aggregation在没有任何数字聚合的情况下选择分组依据中的第一行
【发布时间】:2019-03-18 23:03:54
【问题描述】:

我正在尝试在访问中构建一个项目表。我有项目编号、制造商名称和产品描述。我希望我的 PK 是项目编号和制造商名称。但是,我有大约 5k 个区域,其中产品描述根据描述本身的细微变化创建重复项。我想通过根据项目编号和制造商名称对所有项目进行分组来创建表,然后选择第一个结果。

注意:我在下面尝试的方法使用 MIN/MAX。这不一定是建议的方法。最终目标是为每个组选择顶行或单行因此,如果我有 2 个零件号表示 123 和 2 个该零件号的产品描述,我只想显示其中一个描述。哪个都无所谓。

例子:

Item_Num、MFG_Name、Product_Desc

414001000, AMBU INC., ASCOPE 3,LARGE,5.8/2.8 5EA/BX

414001000, AMBU INC., ASCOPE 3,LARGE,5.8/2.8 5EA/BX

06L21-01, ABBOTT LABORATORIES INC, 07K0040AT HAVAB-M CALB 4ML RX

06L21-01, ABBOTT LABORATORIES INC, ARCHITECT HAVAB-M CALB 4ML RX

理想情况下,这是我的结果:

Item_Num、MFG_Name、Product_Desc

414001000, AMBU INC., ASCOPE 3,LARGE,5.8/2.8 5EA/BX

06L21-01, ABBOTT LABORATORIES INC, 07K0040AT HAVAB-M CALB 4ML RX

到目前为止,我的想法是计算描述的长度以进行量化。然后使用 min/max 选择所需的那个。到目前为止我的代码是:

SELECT
x.distributor_item_number, 
x.mfg_item_number, 
x.mfg_name, 
x.distributor_product_description, 
min(x.[LENGTH OF DESC]) 

INTO Product_Table
FROM [Product Table] AS x 

INNER JOIN 
(SELECT p.distributor_item_number, 
max(p.[LENGTH OF DESC]) AS [MAX LENGTH] 
FROM [Product Table] AS p 
GROUP BY p.distributor_item_number)  AS y ON (y.distributor_item_number = x.distributor_item_number) AND (y.[MAX LENGTH] = X.[LENGTH OF DESC])

GROUP BY x.distributor_item_number, x.mfg_item_number, x.mfg_name, x.distributor_product_description;

但是,它似乎不起作用。我的数据中仍有重复项。

任何帮助都会很棒。

【问题讨论】:

  • 使用 min/max 选择所需的 哪个是所需的?最小或最大长度的那个?
  • 可能有不止 1 个具有相同的最小/最大长度。
  • 老实说,长度无关紧要。最终目标是每组选择 1 个。这是对表在描述中具有重复值的表进行标准化的尝试。谢谢
  • distributor_item_number 是否对每个 distributor_product_description 都是唯一的?如果不是,distributor_item_number 和 mfg_item_number 之间是什么关系?当您提到我的数据中仍然存在重复项时,请同时显示不想要的结果。

标签: sql ms-access


【解决方案1】:

我最终在 select 语句中添加了一个序列号,该序列号将为每个组排序。然后我只选择了每个序列的第一行。代码如下

SELECT 

p1.mfg_item_number, 
p1.mfg_name, 
p1.distributor_product_description,
Count(*) AS Seq

INTO Clean_Product_Table

FROM Product_Table AS p1 

INNER JOIN Product_Table AS p2 ON (p2.mfg_item_number = p1.mfg_item_number) 
                               AND (P2.MFG_NAME = P1.MFG_NAME) 
                               AND (p2.InoSeq <= p1.InoSeq)

GROUP BY p1.mfg_item_number, 
         p1.mfg_name, 
         p1.distributor_product_description

HAVING COUNT(*) = 1
ORDER BY 1, 2, 5;

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多