首页 > 解决方案 > 在没有任何数字聚合的情况下选择分组依据中的第一行

问题描述

我正在尝试在访问中构建一个项目表。我有项目编号、制造商名称和产品描述。我希望我的 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,雅培实验室公司,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,雅培实验室公司,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;

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

任何帮助都会很棒。

标签: sqlms-access

解决方案


我最终在 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;

推荐阅读