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

问题描述

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

我有一张这样的桌子:

用户名 Field1 Field2
AAA NULL 1
AAA type1 12
AAA type2 21
AAA type3 1
BBB 6
BBB type1 2
BBB type4 3
CCC type1 23
CCC type3 352
CCC type4 12

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

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

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

我的最终结果应该是:

用户名 Field1 Field2 字段 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 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。 希望我已经清楚我需要做什么,如果您需要更多解释,请告诉我。感谢您的帮助!

解决方法

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

条件

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

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

,

谢谢你的回答!

最后,我使用了

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

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