#sql #sql-server
#sql #sql-сервер
Вопрос:
Вот некоторые фиктивные данные:
DECLARE @trial TABLE (id int identity, val int)
INSERT INTO @trial (val)
VALUES (1), (3),(8), (10), (8),(3), (1), (10),(8), (1), (3),(10)
select * from @trial order by id
Вот мой ожидаемый результат:
val duplicateindex
1 0
3 0
8 0
10 0
8 1
3 1
1 1
10 1
8 2
1 2
3 2
10 2
Я в основном пытаюсь найти количество дубликатов текущего значения строки в строках, предшествующих неограниченному. Можно считать текущую строку также в дубликате, поэтому, даже если все значения duplicateindex сдвинуты на 1, это тоже нормально.
Любые идеи, пожалуйста? Я использую SQL Server 2016. Спасибо.
Ответ №1:
Вам нужна COUNT()
функция окна:
select id, val, count(*) over (partition by val order by id) duplicateindex
from @trial
order by id
Вы можете вычесть 1 из duplicateindex
.
Смотрите демонстрацию.
Результаты:
> id | val | duplicateindex
> -: | --: | -------------:
> 1 | 1 | 1
> 2 | 3 | 1
> 3 | 8 | 1
> 4 | 10 | 1
> 5 | 8 | 2
> 6 | 3 | 2
> 7 | 1 | 2
> 8 | 10 | 2
> 9 | 8 | 3
> 10 | 1 | 3
> 11 | 3 | 3
> 12 | 10 | 3
Комментарии:
1. выберите * из (выберите идентификатор, значение, количество (*) поверх (разделите по порядку значений по идентификатору) дублируйте индекс из @trial ) порядок таблиц по идентификатору
2. большое спасибо. могу ли я предположить, что код, который я написал выше, обеспечит сохранение порядка, как ожидалось?
3. Вам не нужен подзапрос.
4. мне нужно использовать duplicateindex в некоторой дальнейшей обработке, поэтому, следовательно, подзапрос
5. Затем ваш запрос вернет все строки, упорядоченные по идентификатору.