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 的提示。我不知道,它可能非常有用。
我写信给你是因为我找不到解决我的问题的方法,我什至不知道是否有办法解决。我在 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 的提示。我不知道,它可能非常有用。