SQL, повторяющиеся строки подсчета, предшествующие неограниченному

#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. Затем ваш запрос вернет все строки, упорядоченные по идентификатору.