Chà, bạn không gần đến mức đó vì row_number()
không thể theo dõi trình tự của hai nhóm cùng một lúc. PARTITION BY tm_nl_fixedid ORDER BY date RESTART ON GAP
không tồn tại, không có thứ đó.
Itzik Ben-Gan có một giải pháp cho vấn đề các hòn đảo và khoảng trống mà bạn đang gặp phải (thực tế là một số giải pháp). Ý tưởng là sắp xếp thứ tự các hàng theo tiêu chí chính (ngày) và sau đó theo tiêu chí phân vùng + tiêu chí chính. Sự khác biệt giữa các thứ tự sẽ không thay đổi vì chúng thuộc cùng một tiêu chí phân vùng và chuỗi ngày.
with cte as
(
select *,
-- While order by date and order by something-else, date
-- run along, they belong to the same sequence
row_number() over (order by tm_date)
- row_number() over (order by tm_nl_fixedid, tm_date) grp
from trackingMessages
)
select *,
-- Now we can get ordinal number grouped by each sequence
row_number() over (partition by tm_nl_fixedid, grp
order by tm_date) rn
from cte
order by tm_date
Và đây là chương 5 của Sql Server MVP Deep Dives với một số giải pháp cho vấn đề đảo và khoảng trống .