增加组的行号

Cal*_*der 41 sql sql-server sql-server-2005

我正在研究SQL Server 2005的查询,需要返回带有两个"索引"字段的数据.每次'shade'列更改时,第一个索引't_index'应该递增,而第二个索引在'shade'列中的值的分区内递增:

t_index s_index shade
1       1       A
1       2       A
1       3       A
1       4       A
1       5       A
2       1       B
2       2       B
2       3       B
2       4       B
2       5       B
Run Code Online (Sandbox Code Playgroud)

要获取s_index列,我使用以下内容:

Select ROW_NUMBER() OVER(PARTITION BY [shade] ORDER BY [shade]) as s_index
Run Code Online (Sandbox Code Playgroud)

我的问题是如何让第一个索引只在'shade'列中的值发生变化时递增?

mar*_*c_s 50

您可以尝试使用DENSE_RANK()它:

SELECT
    shade,
    s_index = ROW_NUMBER() OVER(PARTITION BY [shade] ORDER BY [shade]),
    t_index = DENSE_RANK() OVER (ORDER BY [shade])
FROM dbo.YourTableNameHEre
Run Code Online (Sandbox Code Playgroud)

给出输出:

shade  s_index  t_index
  A      1        1
  A      2        1
  A      3        1
  A      4        1
  A      5        1
  B      1        2
  B      2        2
  B      3        2
  B      4        2
  B      5        2
Run Code Online (Sandbox Code Playgroud)

  • 如果阴影恢复到先前的值,这将不起作用. (4认同)

Me.*_*ame 43

这可以通过(DENSE_)RANK函数完成:

  DENSE_RANK() OVER(Order By [shade]) as t_index
Run Code Online (Sandbox Code Playgroud)