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:合并表中列的相似值并为其分配标识符的主要内容,如果未能解决你的问题,请参考以下文章