這是窗口函數(稱爲解析函數中的Oracle)的應用程序。
您的目標是爲每個停靠點序列分配一個「塊號」。也就是說,在一個序列中(車輛)的所有停止將具有相同的塊編號,並且這將與所有其他停止序列不同。
下面是分配塊數的方法:
- 創建速度標誌,該標誌表示1時速度> 0和0時速度= 0
- 枚舉的所有記錄,其中的速度標誌= 1.這些是「塊」。
- 做一個自加入,將每個標誌= 0放入一個塊(這需要分組並取最大的blocknum)。
- 按持續時間或無論你想要總結。
以下代碼是我的意思的草圖。它不會解決你的問題,因爲你不清楚如何處理日間休息,你想要總結什麼信息,並且它有一個錯誤的1錯誤(在每個停止序列中它包括前一個不停止的,如果有的話)。
with vd as
(
select vd.*,
(case when SpeedFlag = 1
then ROW_NUMBER() over (partition by id, SpeedFlag) end) as blocknum
from
(
select vd.*, (case when speed = 0 then 0 else 1 end) as SpeedFlag
from vehicaldata vd
) vd
)
select id, blocknum, COUNT(*) as numrecs, SUM(duration) as duration
from
(
select vd.id, vd.rtime, vd.duration, MAX(vdprev.blocknum) as blocknum
from vd
left outer join vd vdprev
on vd.id = vdprev.id
and vd.rtime > vdprev.rtime
group by vd.id, vd.rtime, vd.duration
) vd
group by id, blocknum
請發佈您迄今爲止編寫的代碼。人們通常不喜歡只爲你寫代碼。 – 2010-06-05 05:44:31
這很難做到。關於連續範圍的這篇文章可能會幫助你在你的方式http://www.xaprb.com/blog/2006/03/22/find-contiguous-ranges-with-sql/ – 2010-06-05 14:12:55
感謝百萬馬丁,這是非常有幫助的,我用本指南編寫查詢,謝謝。 每個人都想看到查詢我可以把它放在這裏 – sirvan 2010-06-07 06:46:43