正常的方式,你會做什麼你要的是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