2016-06-27 4 views
2

У меня есть столбец, который имеет такие значения, какSQL Приращение счетчика

2014.STA.? 
2014.STA.? 
2014.STA.? 
2015.STA.? 
2016.STA.? 
2014.STA.? 
2014.STA.? 
2016.STA.? 

Мне нужно создать функцию, которая я группа по годам и добавить индекс вместо «?». Это значит, что я хочу, чтобы получить результат, как этот

2014.STA.1 
2014.STA.2 
2014.STA.3 
2015.STA.1 
2016.STA.1 
2014.STA.4 
2014.STA.5 
2016.STA.2 

Я не знаю, как Grup эти колонки и использовать его в функцию.

для mssql2008

ответ

1
select substring(c1, 1, 9) + CONVERT(CHAR, ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4))) from @tabla 

Он работает на моем SQL Server 2014. Проверьте это:

select substring(c1, 1, 9) + cast(ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4)) as char(12)) from @tabla 

Если в годовом сопоставлении хотите заказать по номеру:

select r1 from (
select substring(c1, 1, 9) + cast(ROW_NUMBER() OVER (partition by c1 ORDER BY substring(c1,1,4)) as char(12)) AS r1 from @tabla) AS T 
order by substring(r1, 10, len(r1)) 
+0

, ваш код работает немного по-другому .. У меня есть результат – unbalanced

+0

2014.STA.124 2014.STA.125 2014.STA.72 2015. STA.12 2016.STA.64 2014.STA.295 2014.STA.105 2016.STA.65 2014.STA.182 – unbalanced

+0

не начинается с 1 ... первое число 124 – unbalanced

3

Использование Row_Number функции окна для генерации номера

select left(yourcol,len(yourcol)-1)+cast(RN as varchar(20)) 
(
select row_number()over(partition by your_col order yourcol) As RN,* 
From yourtable 
) 
+0

я не мог реализовать свой код .. это дает много ошибок .. У меня сложный запрос и сложно реализовать это – unbalanced

+0

, и я думаю, что этот код не группируется по дате? – unbalanced

3

Я думаю, что это делает то, что вы хотите:

select (left(col, 9) + 
     cast(row_number() over (partition by left(col, 9) order by (select null)) as varchar(255)) 
     ) 

Примечание: Это ставит произвольное упорядочение по значениям , Предположительно, есть столбец, который указывает правильное упорядочение чисел.

На самом деле, вы можете сделать это без cast() с помощью replace():

select replace(col, '?', 
       row_number() over (partition by left(col, 9) order by (select NULL)) 
      ) 

cast() подразумевается в этой версии.

+0

Ничего себе, вторая версия классная –

+0

Благодарим вас за ответ, первый код имеет проблему с varchar (255) .. и для второго кода функция ранжирования «row_number» должна иметь предложение ORDER BY. ошибка – unbalanced

+0

и я думаю, что этот код не группируется по дате? Мне нужно сгруппировать по дате. Если вы увидите первое сообщение, вы увидите, что оно связано с годом – unbalanced

Смежные вопросы