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:根据另一列和上面的读取行连接列中的数据的主要内容,如果未能解决你的问题,请参考以下文章