SQL:根据另一列和上面的读取行连接列中的数据

Posted

技术标签:

【中文标题】SQL:根据另一列和上面的读取行连接列中的数据【英文标题】:SQL : Concatenate data from a column depending on another column and reading row above 【发布时间】:2021-01-20 20:23:29 【问题描述】:

我给你写信是因为我找不到任何解决我问题的方法,我什至不知道是否有办法解决。我正在使用 SQL (MonetDB)。

我有一张这样的桌子:

username Field1 Field2
AAA NULL 1
AAA type1 12
AAA type2 21
AAA type3 1
BBB null 6
BBB type1 2
BBB type4 3
CCC type1 23
CCC type3 352
CCC type4 12

这个表已经按用户名排序(首先是空值),然后是 field1,我在这两个列上没有任何重复。

我需要更新另一列。 当上面的行具有相同的用户名并且 field1 不为空时,那么 new field3 应该是 CONCAT(Field1, Field2) 然后对于下一行,如果用户名相同,但 Field1 又不是 null 并且与上一个不同,则 Field3 应该是 CONCAT(previous Field3, Field1, Field2)。

我正在尝试逐行调整执行此操作的处理,并保留保存的最后一个值,这就是为什么我在关系数据库中努力做到这一点。

我的最终结果应该是:

username Field1 Field2 Field 3
AAA NULL 1
AAA type1 12 type1 : 12
AAA type2 21 type1 : 12 type 2 : 21
AAA type3 1 type1 : 12 type 2 : 21 type3: 1
BBB null 6
BBB type1 2 type1:2
BBB type4 3 type1:2 type4:3
CCC type1 23 type1 : 23
CCC type3 352 type1 : 23 type 3:352
CCC type4 12 type1 : 23 type 3:352 type 4:12

之后的最终目标是选择用户名和用户名最长的字段3。 希望我已经清楚我需要做什么,如果您需要更多解释,请告诉我。感谢您的帮助!

【问题讨论】:

【参考方案1】:

如果您想使用前一行中的信息,您必须查看“窗口函数”。它们存在于许多 SQL 数据库中,包括 MonetDB:https://www.monetdb.org/Documentation/SQLReference/FunctionsAndOperators/WindowFunctions

条件

WHERE LAG(username) OVER (ORDER BY username, field1) = username

将检查前一行的username(以username, field给出的顺序)是否等于当前行的username

【讨论】:

【参考方案2】:

感谢您的回答!

最后,我用了

选择用户名, sys.GROUP_CONCAT( Field1 || ': ' || Field2, ' - ') AS Field3 FROM 表;

谁工作得很好!但感谢窗口功能 LAG 的点亮。我不知道它,它可能非常有用。

【讨论】:

以上是关于SQL:根据另一列和上面的读取行连接列中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 根据另一列中的类别计算列和列表之间常见值的百分比

在C#中进行DataTable操作:根据列数据插入一些汇总行

Pyspark根据另一列的模式替换列中的字符串

根据另一列中的 INT 创建 N 行

根据另一列删除一列中的重复行并保持其他列不变

在一列中对具有相同数据的行进行分组,并将其相关数据汇总在另一列中 [ORACLE SQL]