Как создать внутреннюю нумерацию вхождений с помощью SQL

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Как я могу создать новый столбец (inCount) с нумерацией вхождений в определенном столбце? Вот пример:

 id      name        inCount
1       Orly        1
2       Ernest      1
3       Rachel      1
4       Don         1
5       Don         2
6       Ernest      2
7       Angela      1
8       Ernest      3
9       David       1
10      Rachel      2
11      Sully       1
12      Sully       2
13      Rachel      3
14      David       2
15      David       3
16      Kevin       1
17      Kevin       2
18      Orly        2
19      Angela      2
20      Sully       3
21      Kevin       3
22      Don         3
23      Orly        3
24      Angela      3
 

Don из идентификатора 5 имеет номер 2, потому что Don также отображается в идентификаторе 4.
Don из идентификатора 22 имеет номер 3 из-за вышеупомянутых предыдущих вхождений.

Я использую MS SQL SERVER 2008 R2 Express edition.

Спасибо.

Ответ №1:

Вы могли бы использовать partition by , например:

 select  row_number() over (partition by name order by id) as inCount
,       *
from    YourTable
order by
        id
 

Ответ №2:

Это должно сработать

 SELECT id, Name, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY id)
  FROM table
 ORDER BY id
 

РЕДАКТИРОВАТЬ: Добавлено предложение order by в select, чтобы показывать результаты в том же порядке, что и в OP. Порядок ПО в ROW_NUMBER не изменил результат, но я изменил на id, поскольку он сохранит row_number правильным для выборочных данных.

Комментарии:

1.Он собирается сделать заказ по тому id , а не по тому name , чтобы получить желаемую нумерацию. Упорядочение по name может (например, поведение потенциально не определено) привести к тому, что разные id s будут помечены с заданным приращением inCount .

2. @X-Zero — я сам был обеспокоен этим, но я провел быстрый тест, и на результат это не повлияло, если для выбора был указан order by . Я вижу, что результаты могут быть не 100%, поэтому я согласен — это должен быть порядок по идентификатору в предложении row_number .