正常的方式,你会做什么你要的是DENSE_RANK函数:
select key, val,
dense_rank() over (order by key, val)
from t
然而,这并没有解决分离的最后一个群体的问题。
为了解决这个问题,我必须假设有一个“id”列。 SQL中的表没有排序,所以我需要排序。如果您使用的是SQL Server 2012,那么您可以使用lag()函数来获取所需内容。使用滞后,看是否关键,值对是连续的行相同:
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() 。
表格是否有唯一的标识符? – 2012-07-06 14:39:29
没有办法可靠地做到这一点,除非有办法区分表中的行的顺序。如上所述,如果表是堆,然后添加聚集索引,则可能会/应该得到不同的结果。你需要提供更多信息。 – Sean 2012-07-06 14:44:18
您的意思是第3,4和6行包含相同的数据。您绝不应该依赖于表格数据的存储方式。 SQL不能像那样工作。即使您确实知道SQL Server 2005始终以某种方式存储数据,但这并不意味着2008年也会如此,或者2014年将会如此。如果你想要一个特定的订单,那么你需要在一列中设置它(例如可能使用时间戳) – Rodolfo 2012-07-06 14:57:06