首页 > 解决方案 > 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。谢谢。

标签: sqlsql-server

解决方案


您需要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

推荐阅读