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

Откуда: Москва
Сообщений: 558
Задача следующая, есть таблица с огромным кол-вом строк. Мне нужно написать View, где строчки разбиваются на группы по 5 строк. т.е создать столбец, где будет нумерация от 1 до N. И каждые 5 строк будут иметь уникальный номер. Пример того, что нужно на рисунке

Картинка с другого сайта.
12 мар 19, 12:10    [21830093]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6262
msleg,

FLOOR((N-1)/5.)+1
12 мар 19, 12:15    [21830098]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1297
msleg,

declare @batch_size int = 3;

with 
  t(id) as 
    (
      select * 
        from (values (1),(2),(3),(4),(5),(6),
                     (7),(8),(9),(10),(11),(12),
                     (13),(14),(15)
             ) as v(id)
    )
--
select id
     , (row_number()over(order by (select null)) - 1)/ @batch_size + 1     
  from t
12 мар 19, 12:21    [21830110]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
msleg
Member

Откуда: Москва
Сообщений: 558
TaPaK, спасибо за подсказку. Сделал следующим образом

SELECT 
  FLOOR((ROW_NUMBER() over (order by [MessageID])-1)/5.)+1 
  ,[MessageID]      
FROM [LotInfo]
12 мар 19, 13:15    [21830194]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
msleg
Member

Откуда: Москва
Сообщений: 558
msleg,

Нашел еще интересную информацию. Чтобы не забыть про ранжирующие функции
18 мар 19, 09:24    [21835596]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
msleg
Member

Откуда: Москва
Сообщений: 558
msleg,

https://docs.microsoft.com/ru-ru/sql/t-sql/functions/ranking-functions-transact-sql?view=sql-server-2017
18 мар 19, 09:24    [21835597]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
uaggster
Member

Откуда:
Сообщений: 567
msleg
TaPaK, спасибо за подсказку. Сделал следующим образом

SELECT 
  FLOOR((ROW_NUMBER() over (order by [MessageID])-1)/5.)+1 
  ,[MessageID]      
FROM [LotInfo]

На самом деле это ОЧЕНЬ плохое решение, т.к. для того, чтобы построить номер, Вы предварительно сортируете всю выборку, и хорошо, если по MessageID есть индекс.
Делать нужно так, как предложил TaPaK, или Щукина Анна.

Я бы сделал так, как предложила Щукина Анна, т.к. нельзя полагаться на то, что автоинкременты идут без разрывов.
20 мар 19, 13:42    [21838465]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
Wlr-l
Member

Откуда:
Сообщений: 483
uaggster,

row_number() over(order by (select null))

row_number() over(order by id)


Можете пояснить, почему в первом случае "разрывы в автоинкременте" не влияют на результат, а во втором случае влияют?
20 мар 19, 14:32    [21838532]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3054
Wlr-l,

В приведенных вами сэмплах разницы нет, насколько я помню. А вот ТаРаК нигде не упоминает row_number(), у него там только некий загадочный N. Если истолковать это как Id, а новички так обычно и делают, то как раз пропуски в нумерации и доставят.
20 мар 19, 15:18    [21838601]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
Wlr-l
Member

Откуда:
Сообщений: 483
Ennor Tiegael,

Вопрос был uaggster.

ТС уже пронумеровал свою последовательность от 1 до N каким-то способом. ТaPaK предложил формулу для нумерации групп, без всяких намеков на реализацию. На основании этой формулы Щукина Анна и ТС дали решения.

uaggster сказал, что решение ТС "ОЧЕНЬ плохое". Поэтому я и спросил uaggsterа о влиянии автоинкремента. На самом деле, в этих двух решениях автоинкремент и пропуски в нем никак не влияют на результат. В этом плане они идентичны, так как они оба перенумеровывают уже пронумерованное.

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

Поэтому не корректно говорить, что второй вариант очень плохой.
20 мар 19, 16:08    [21838684]     Ответить | Цитировать Сообщить модератору
 Re: Специальная нумерацию строк T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28365
uaggster
т.к. для того, чтобы построить номер, Вы предварительно сортируете всю выборку
Разве сортируется? По моему, нет, именно потому, что по MessageID есть индекс.
20 мар 19, 21:42    [21838975]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить