TSQL编号行基于fieldvalue的更改并按日期排序,并在重复项上增加数字

时间:2016-09-22 18:38:13

标签: sql sql-server

说我有以下数据:

X | 2/2/2000
X | 2/3/2000
B | 2/4/2000
B | 2/10/2000
B | 2/10/2000
J | 2/11/2000
X | 3/1/2000

我想获得这样的数据集:

1 | X | 2/2/2000
1 | X | 2/3/2000
2 | B | 2/4/2000
2 | B | 2/10/2000
2 | B | 2/10/2000
3 | J | 2/11/2000
4 | X | 3/1/2000

到目前为止,我所尝试的所有内容都要么最后编号,每次更改都会重置每个字段值更改的计数,或者在示例中将最后一个X保留为1。

2 个答案:

答案 0 :(得分:0)

这是一个空白和岛屿问题。您可以使用行号的差异:

select dense_rank() over (order by col1, seqnum_1 - seqnum_2) as col0,
       col1, col2
from (select t.*,
             row_number() over (order by col2) as seqnum_1,
             row_number() over (partition by col1 order by col2) as seqnum_2
      from t
     ) t;

解释为什么这个工作有点麻烦。如果运行子查询,您将看到如何分配序列号以及为什么差异是您想要的。

答案 1 :(得分:0)

您可以这样查询:

SELECT dense_rank() over(order by yourcolumn1), * from yourtable