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

SQL : Concatenate data from a column depending on another column and reading row above

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

我有一个像这样的 table :

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

这个 table 已经按用户名排序(首先是空值),然后是字段 1,而且我没有对这两个列进行任何重复。

我需要更新另一列。 当上面的行具有相同的用户名并且 field1 不为空时,则新的 field3 应该是 CONCAT(Field1, Field2) 然后对于下一行,如果用户名相同但 Field1 不再为空并且与前一个不同,则 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

最终目标是 select username 和最长的 field3 by username。 希望我已经清楚我需要做什么,如果您需要更多解释,请告诉我。感谢您的帮助!

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

条件

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

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

感谢您的回答!

最后,我用了

SELECTuser_name, sys.GROUP_CONCAT( Field1 || ': ' || Field2, ' - ') AS Field3 从 table;

谁工作得很好!但是感谢 window 函数 LAG 的提示。我不知道,它可能非常有用。