#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 .