Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Получить следующий идекс для пары значений  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Привет!

Есть такая задачка:

Имя в таблице может хранится в виде
suffix_prefix_x

Name
suff1_preff1_1
suff1_preff1_2
suff1_preff1_3
suff1_preff1_18
suff1_preff1_100500
suff1_preff1_test(т.е. не всегда имя может оканчивается на x)
suff2_preff2_1

Теперь нужно достать след достуный x для пары suff1 - preff1, т.е. на выходе нужно получить 4.
11 фев 15, 12:32    [17249274]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Glory
Member

Откуда:
Сообщений: 104760
select replace(name, 'suff1_preff1_', '') from mytable where name like 'suff1_preff1_%'
11 фев 15, 12:36    [17249299]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20609
Поиск "дырок" в последовательности ключей
11 фев 15, 12:53    [17249440]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Glory, понятно же, что ваш пример возвращает на последний индекс, а все...
11 фев 15, 16:30    [17251323]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4279
Manonia
Glory, понятно же, что ваш пример возвращает на последний индекс, а все...

select top 1 .... order by .... desc

Только что вы будете делать, когда несколько пользователей одновременно запросят идентификатор?
11 фев 15, 16:41    [17251392]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
SQL2008, на сохранении будет проверка имени на уникальность.

Не совсем верный ваш вариант, в условии я написала, что могут быть значения
suff1_preff1_1
suff1_preff1_2
suff1_preff1_3
suff1_preff1_18
suff1_preff1_100500

В вашем варианте top 1 = 100500, а мне нужно - 4.
11 фев 15, 21:26    [17252504]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Добрый Э - Эх
Guest
Manonia,

--
-- Тестовый набор данных:
with
  t(name) as
    (
      select *
        from ( values 
                -- 
                 ('suff1_preff1_1'),
                 ('suff1_preff1_2'),
                 ('suff1_preff1_3'),
                 ('suff1_preff1_18'),
                 ('suff1_preff1_100500'),
                --
                 ('suff2_preff2_5'),
                 ('suff2_preff2_6'),
                --
                 ('suff3_preff3_10'),
                 ('suff3_preff3_11')
             ) v (n)
    )
--
-- Основной запрос:
select top 1 with ties 
       x_name, MAX(x_num) + 1 as next_num
  from (
         select name
              , x_num
              , x_name
              , grp_id = ROW_NUMBER() over(partition by x_name order by x_num) - x_num
           from (
                  select name
                       , x_num = cast(right(name, CHARINDEX('_', reverse(name)) - 1) as int)
                       , x_name = LEFT(name, LEN(name) - CHARINDEX('_', reverse(name)))
                    from t
                ) v0
        )v1
  group by x_name, grp_id
  order by ROW_NUMBER() over(partition by x_name order by max(x_num))

0) необходимо "допилить" обработку на "не всегда имя может оканчивается на x"
1) если требуется - в самый глубоковложенный подзапрос добавить условие по отбору записей только для одного конкретного сочетания suff / preff
12 фев 15, 06:44    [17253449]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Добрый Э - Эх
Guest
Manonia
мне нужно - 4.
хотя, в данном случае и такого будет достаточно:
--
-- Тестовый набор данных:
with
  t(name) as
    (
      select *
        from ( values 
                -- 
                 ('suff1_preff1_1'),
                 ('suff1_preff1_2'),
                 ('suff1_preff1_3'),
                 ('suff1_preff1_18'),
                 ('suff1_preff1_100500'),
                --
                 ('suff2_preff2_5'),
                 ('suff2_preff2_6'),
                --
                 ('suff3_preff3_10'),
                 ('suff3_preff3_11')
             ) v (n)
    )
--
-- Основной запрос:
select top 1
       next_num = x_num + 1
  from (
         select name
              , x_num  = cast(right(name, CHARINDEX('_', reverse(name)) - 1) as int)
              , suffN_preffN = LEFT(name, LEN(name) - CHARINDEX('_', reverse(name)))
           from t
          where name like '%suff1%preff1%' 
       ) v0
 order by x_num - ROW_NUMBER() over(partition by suffN_preffN order by x_num)
        , x_num desc
12 фев 15, 07:03    [17253456]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
Manonia
Member

Откуда: Иркутск
Сообщений: 112
Добрый Э - Эх, спасибо большое!

Подскажите, а как-нибудь ситуацию типа:

suff_preff_500
suff_pref_trata_600
suff_preff_tr_er

можно решить кроме как Name like ('%suff_preff_%') and not like ('%suff_preff_%_%'), потому как нужно обработать только suff_preff_500. [Понятно, что помимо еще потребуется проверка на IsNumeric].
14 фев 15, 16:25    [17265115]     Ответить | Цитировать Сообщить модератору
 Re: Получить следующий идекс для пары значений  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Manonia
можно решить кроме как Name like ('%suff_preff_%') and not like ('%suff_preff_%_%'), потому как нужно обработать только suff_preff_500
Не помните, что означает символ подчёркивания в шаблоне для LIKE?
14 фев 15, 17:08    [17265217]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить