SQL:合并表中列的相似值并为其分配标识符

Posted

技术标签:

【中文标题】SQL:合并表中列的相似值并为其分配标识符【英文标题】:SQL: Consolidating similar values of a column in a table and assign them an identifier 【发布时间】:2021-08-27 14:02:51 【问题描述】:

我有一张如下表:

IndentNo     MaterialId
-----------------------
1001         22345
1001         23457
1001         24456
1002         22345
1002         23457
1002         24456
1003         29987
1003         22345
1003         24456

现在我想根据以下条件对这些缩进进行俱乐部:

1. Same MaterialId
2. Same count of MaterialId

因此IndentNo 1001 和 1002 应合并,结果表应如下所示:

 Consolidation_No    IndentNo     MaterialId
 --------------------------------------------
   CON_1              1001         22345
   CON_1              1001         23457
   CON_1              1001         24456
   CON_1              1002         22345
   CON_1              1002         23457
   CON_1              1002         24456         

我正在使用以下查询:

 SELECT 
     a."IndentNo", a."Mat_List", a."Mat_Count" 
 FROM 
     (SELECT 
          "IndentNo", 
          STRING_AGG(CAST("MaterialId" AS varchar),',') AS "Mat_List", 
          COUNT(DISTINCT("MaterialId")) AS "Mat_Count" 
      FROM 
          table 
      GROUP BY 
          "IndentNo") a
 INNER JOIN 
     (SELECT 
          "IndentNo", 
          STRING_AGG(CAST("MaterialId" AS varchar),',') AS "Mat_List",
          COUNT(DISTINCT("MaterialId")) AS "Mat_Count" 
      FROM 
          table
      GROUP BY 
          "IndentNo") x ON a."Mat_List" = x."Mat_List"
                        AND a."Mat_Count" = x."Mat_Count"

上述查询产生的结果不符合我的要求。我怎样才能拥有Consolidation_No 列。此外,上述查询是否满足第二个条件?

【问题讨论】:

那么,您想为MaterialId 包含的MaterialId 值集生成一个新的Consolidation_No 吗?闻起来像关系除法... 是的。正是。 什么是club?它是否与您显示的数据有某种关系。 【参考方案1】:

可能最简单的方法是聚合成一个字符串或数组并比较它们。然后生成最终表:

select t.*,
       dense_rank() over (order by materials) as consolidation_num
from (select im.*,
             count(*) over (partition by materials) as num_indentno
      from (select indentno,
                   string_agg(materialid::text, '' order by materialid::text) as materials
            from precontract.tblindentdetails t
            group by indentno
           ) im
     ) im join
     precontract.tblindentdetails t
     on t.indentno = im.indentno
where im.num_indentno > 1;

这里的合并编号是一个数字。如果您愿意,可以将其转换为其他格式。

【讨论】:

上述解决方案不起作用。 ERROR: relation "t" does not exist @pythondumb 。 . .那是您的表的别名。输入你的表名并给它别名t 我知道t 是别名。鉴于实际表名是precontract.tblindentdetails,您能否修改答案?因为我试过了,但它仍然给出同样的错误。

以上是关于SQL:合并表中列的相似值并为其分配标识符的主要内容,如果未能解决你的问题,请参考以下文章

如何控制 SQL Server 中新标识列的分配顺序?

SQL Server 表未显示表中列的值

用其他表中列的唯一值数填充sql表中的列

在具有标识列的 SQL Server Compact 4.0 表中插入的性能呈指数下降

更改增量表中列的数据类型

SQL Server中的标识列