问题描述
我写信给你是因为我找不到任何解决我的问题的方法,我什至不知道是否有办法解决。我正在使用 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 上的亮灯。我不知道它,它可能非常有用。