一種方法是使用跨每行的遞歸CTE。如果該行符合條件(相同區域的遞增順序號),則將鏈長增加1。如果沒有,你開始一個新的鏈:
; with numbered as
(
select row_number() over (order by area, eventtime) rn
, *
from Table1
)
, recurse as
(
select rn
, area
, OrderNumber
, 1 as ChainLength
from numbered
where rn = 1
union all
select cur.rn
, cur.area
, cur.OrderNumber
, case
when cur.area = prev.area
and cur.OrderNumber > prev.OrderNumber
then prev.ChainLength + 1
else 1
end
from recurse prev
join numbered cur
on prev.rn + 1 = cur.rn
)
select area
, max(ChainLength)
from recurse
group by
area
Live example at SQL Fiddle.
的另一種方法是使用查詢來查找「休息」,也就是說,爲了結束越來越多的順序排爲同一地區。斷點之間的行數是長度。
; with numbered as
(
select row_number() over (order by area, eventtime) rn
, *
from Table1 t1
)
-- Select rows that break an increasing chain
, breaks as
(
select row_number() over (order by cur.rn) rn2
, cur.rn
, cur.Area
from numbered cur
left join
numbered prev
on cur.rn = prev.rn + 1
where cur.OrderNumber <= prev.OrderNumber
or cur.Area <> prev.Area
or prev.Area is null
)
-- Add a final break after the last row
, breaks2 as
(
select *
from breaks
union all
select count(*) + 1
, max(rn) + 1
, null
from breaks
)
select series_start.area
, max(series_end.rn - series_start.rn)
from breaks2 series_start
join breaks2 series_end
on series_end.rn2 = series_start.rn2 + 1
group by
series_start.area
Live example at SQL Fiddle.
增加什麼時候點什麼? SQL中沒有行的固有順序,您向我們顯示的兩列中都沒有適合的候選項。 – 2013-03-12 18:08:31
對不起,我忘了添加eventtime列,這是一個日期時間,這將是我們的訂單。如果我通過AREA訂購OrderNumber,那麼產量會如此。然後,我想找到連續增加OrderNumbers – 2013-03-12 18:12:30
@Pat裏克艾倫最長的塊 - 請根據您的上述澄清更新您的文章。 – 2013-03-12 18:23:31