Sql server 基于以前的记录值操作更新值

Sql server 基于以前的记录值操作更新值,sql-server,tsql,sql-update,Sql Server,Tsql,Sql Update,我有下表: ID Revision 1 A.1 1 A.2 1 A.4 1 A 1 B.1 1 B 1 C 1 D.1 我想编写一个查询以返回以下内容: ID Revision Version 1 A.1 A.1 1 A.2 A.2 1

我有下表:

ID        Revision
1          A.1
1          A.2
1          A.4
1          A
1          B.1
1          B
1          C
1          D.1
我想编写一个查询以返回以下内容:

ID        Revision     Version
1          A.1          A.1
1          A.2          A.2
1          A.4          A.4
1          A            A.5
1          B.1          B.1
1          B            B.2
1          C            C.1
1          D.1          D.1
正在寻求帮助。我的问题是,我需要的版本是基于以前的修订加上一

请告知

SELECT ID
    ,Revision
    ,Version = LEFT(Revision, 1)+'.'
        +CAST(ROW_NUMBER() OVER (PARTITION BY ID, LEFT(Revision,1) ORDER BY ID, LEFT(Revision, 1), LEN(Revision) DESC, Revision) AS VARCHAR)
FROM @tbl 
ORDER BY ID, LEFT(Revision, 1), LEN(Revision) DESC, Revision
这将生成您提供的结果集,但版本号不会跳过A.3


ORDER BYs如此笨拙的原因是为了确保没有编号的修订总是最后出现。

好的,我找到了一个丑陋的解决方案。我加入表格以创建当前版本和滞后版本。然后我计算了一个新的字段版本。我的表名是documents

example:
ID            REV        LAG_REV    Version
Xxx           A.1         (null)    A.1
Xxx           A.3         A.1       A.3
Xxx           A           A.3       A.4


  With numbered_docs as (
Select row_number() over (partition by ID order by creation_date) as rn, d.* from documents d
)
select z.ID,z.REVISION,z.lag_row_rev,z.Version into versions from (
Select d1.ID d1.revision, d2.revision as lag_row_rev,d1.CREATION_DATE
,(select case 
    when (CHARINDEX('.',d2.REVISION) > 0 and substring(d2.REVISION,1,CHARINDEX('.', d2.REVISION+'.')-1)=substring(d1.REVISION,1,CHARINDEX('.', d1.REVISION+'.')-1))
    then (substring(d2.REVISION,1,CHARINDEX('.', d2.REVISION)) + cast((cast(SUBSTRING(d2.REVISION,CHARINDEX('.', d2.REVISION)+1,LEN(d2.revision)) as integer)+1) AS varchar))
    when CHARINDEX('.',d1.REVISION) > 0 and CHARINDEX('.',d2.REVISION)=0 then substring(d1.REVISION,1,CHARINDEX('.', d1.REVISION)) + cast((cast(SUBSTRING(d1.REVISION,CHARINDEX('.', d1.REVISION)+1,LEN(d1.revision)) as integer)) AS varchar)
    when d2.REVISION IS null and CHARINDEX('.',d1.REVISION) > 0 then substring(d1.REVISION,1,CHARINDEX('.', d1.REVISION)) + cast((cast(SUBSTRING(d1.REVISION,CHARINDEX('.', d1.REVISION)+1,LEN(d1.revision)) as integer)) AS varchar) 
    when d2.REVISION IS null and CHARINDEX('.',d1.REVISION) = 0 then d1.REVISION+'.1'
    when CHARINDEX('.',d1.REVISION) = 0 and CHARINDEX('.',d2.REVISION) = 0 then d1.REVISION+'.1'
    when CHARINDEX('.',d2.REVISION) > 0 and CHARINDEX('.',d1.REVISION) > 0 and substring(d2.REVISION,1,CHARINDEX('.', d2.REVISION+'.')-1)<> substring(d1.REVISION,1,CHARINDEX('.', d1.REVISION+'.')-1)
    then substring(d1.REVISION,1,CHARINDEX('.', d1.REVISION)) + cast((cast(SUBSTRING(d1.REVISION,CHARINDEX('.', d1.REVISION)+1,LEN(d1.revision)) as integer)) AS varchar)
    else NULL 
    end ) as [Version]
From numbered_docs d1
Left Join numbered_docs d2 on (d1.ID=d2_ID and d1.rn=d2.rn+1)
) z
order by z.ID,z.revision;

版本从A.2跳到A.4是故意的吗?谢谢OGhaza,我考虑了你之前的建议,但是我对跳过A.4有一个问题。我想我不得不接受你的解决方案。谢谢