2013-11-07 3 views
0

У меня есть следующая таблица:значения Обновление на основе предыдущего рекордного значения манипуляции

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 

в поисках помощи. Моя проблема в том, что мне нужна версия, основанная на предыдущей версии плюс одна.

Просьба сообщить.

+0

Является ли это намеренным, что версия пропускает от A.2 до A.4? – OGHaza

ответ

0

Это даст результат набор вы при условии, за исключением того, что номер версии не будет пропускать А.3

Причины ПОРЯДКОВОГО Bys является настолько неудобно, чтобы убедиться, что пересмотр с всегда не появляется номер последний.

+0

Спасибо OGhaza, я подумал о том, что вы предложили раньше, но у меня есть проблема с пропуском a.4. Думаю, мне придется жить с твоим решением. Благодарю. – user2965499

0

OK Я нашел уродливое решение. Я присоединился к таблицам, чтобы создать текущую ревизию и lag_revision. Затем я вычислил новое поле (версия). Имя моей таблицы было документом.

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; 
Смежные вопросы