你会做你想做的正常方式是dense_rank函数:
select key, val,
dense_rank() over (order by key, val)
from t
然而,这并没有解决分离最后一组的问题。
为了处理这个问题,我必须假设有一个“id”列。SQL 中的表没有排序,所以我需要排序。如果您使用的是 SQL Server 2012,那么您可以使用 lag() 函数来获取您需要的内容。使用滞后来查看键、val 对在连续行上是否相同:
with t1 as (
select id, key, val,
(case when key = lead(key, 1) over (order by id) and
val = lead(val, 1) over (order by id)
then 1
else 0
end) as SameAsNext
from t
)
select id, key, val,
sum(SameAsNext) over (order by id) as GroupNum
from t
如果没有 SQL Server 2012(具有累积总和),您必须执行自联接来识别每个组的开头:
select t.*,
from t left outer join
t tprev
on t.id = t2.id + 1 and t.key = t2.key and t.val = t2.val
where t2.id is null
有了这个,使用连接将组分配为最小 id:
select t.id, t.key, t.val,
min(tgrp.id) as GroupId
from t left outer join
(select t.*,
from t left outer join
t tprev
on t.id = t2.id + 1 and t.key = t2.key and t.val = t2.val
where t2.id is null
) tgrp
on t.id >= tgrp.id
如果您希望这些是连续数字,则将它们放在子查询中并使用dense_rank()。