SQL SERVER - 选择下一行值最多 5 个字符,然后用新字符替换第一个字符
Posted
技术标签:
【中文标题】SQL SERVER - 选择下一行值最多 5 个字符,然后用新字符替换第一个字符【英文标题】:SQL SERVER - Select next row value upto 5 characters and then replace first character with new one 【发布时间】:2020-04-14 11:26:20 【问题描述】:我有一种情况,我想读取同一列的下一个值并将其连接到最多五个字符并将其存储在不同的列中,但我无法这样做 请参阅下文以获得更好的可视化效果。
这是输入
------------------------------
| ID | word |
------------------------------
| 1 | M |
| 2 | V |
| 3 | V |
| 4 | M |
| 5 | V |
| 6 | M |
| 7 | V |
| 8 | M |
| 9 | V |
| 10 | V |
------------------------------
期望的输出:
--------------------------------------------
| ID | word | expected |
--------------------------------------------
| 1 | M | M |
| 2 | V | MV |
| 3 | V | MVV |
| 4 | M | MVVM |
| 5 | V | MVVMV |
| 6 | M | VVMVM |
| 7 | V | VMVMV |
| 8 | M | MVMVM |
| 9 | V | VMVMV |
| 10 | V | MVMVV |
--------------------------------------------
在这个预期的列中,当它进入第 6 行并尝试追加时,在追加第 5 个字符后,它将首先从“MVVMV”(第 5 行)中删除第一个字符“M”,然后在第 6 行追加“M” 'MVVMV' 的结尾将是 'VVMVM'
我希望你明白这个逻辑,因为我尝试了很多方法来实现这一点,但没有运气
谢谢
【问题讨论】:
【参考方案1】:您可以使用lag()
和concat()
:
select t.*,
concat(lag(word, 4) over (order by id),
lag(word, 3) over (order by id),
lag(word, 2) over (order by id),
lag(word, 1) over (order by id),
word
) as concat_5
from t;
不幸的是,SQL Server 不(尚)支持 STRING_AGG()
作为窗口函数。如果是这样,您可以使用:
select t.*,
string_agg(word) within group (order by id) over
(order by id rows between 4 preceding and current row) as concat_5
from t;
【讨论】:
我试过了,但它在下一行得到了值,它应该让我在同一行 sqlfiddle.com/#!18/3743fb/1 @abhishek 。 . .我修好了。以上是关于SQL SERVER - 选择下一行值最多 5 个字符,然后用新字符替换第一个字符的主要内容,如果未能解决你的问题,请参考以下文章