2014-09-24 59 views
-1

我在oracle中有數據,連續數字代表不同ID的數據。在這個例子中,開始和結束是每個月依次表示的數字(1月13日是205,2月13日是206,3月13日207等)。我需要確定最長的時間段,其中最多的ID具有連續的月份數據。Oracle SQL查找最多的ID最大的島

我的表看起來像這樣:

TAB1 
╔════════╦═══════╗ 
║ ID ║ MONTH ║ 
╠════════╬═══════╣ 
║ 111118 ║ 210 ║ 
║ 111118 ║ 211 ║ 
║ 111118 ║ 212 ║ 
║ 111118 ║ 213 ║ 
║ 111118 ║ 214 ║ 
║ 111118 ║ 215 ║ 
║ 111118 ║ 216 ║ 
║ 111118 ║ 217 ║ 
║ 111118 ║ 218 ║ 
║ 111118 ║ 219 ║ 
║ 111118 ║ 220 ║ 
║ 111118 ║ 221 ║ 
║ 111118 ║ 222 ║ 
║ 111118 ║ 223 ║ 
║ 111118 ║ 224 ║ 
║ 111118 ║ 225 ║ 
║ 111126 ║ 200 ║ 
║ 111126 ║ 201 ║ 
║ 111126 ║ 205 ║ 
║ 111126 ║ 206 ║ 
║ 111126 ║ 207 ║ 
║ 111126 ║ 208 ║ 
║ 111126 ║ 209 ║ 
║ 111126 ║ 210 ║ 
║ 111126 ║ 211 ║ 
║ 111126 ║ 212 ║ 
║ 111126 ║ 213 ║ 
║ 111126 ║ 214 ║ 
║ 111126 ║ 215 ║ 
║ 111126 ║ 216 ║ 
║ 111126 ║ 217 ║ 
║ 111126 ║ 218 ║ 
║ 111126 ║ 219 ║ 
║ 111126 ║ 220 ║ 
║ 111126 ║ 221 ║ 
║ 111126 ║ 222 ║ 
║ 111126 ║ 223 ║ 
║ 111126 ║ 224 ║ 
║ 111126 ║ 225 ║ 
║ 111127 ║ 211 ║ 
║ 111127 ║ 212 ║ 
║ 111127 ║ 213 ║ 
║ 111127 ║ 214 ║ 
║ 111127 ║ 215 ║ 
║ 111127 ║ 216 ║ 
║ 111127 ║ 217 ║ 
║ 111127 ║ 218 ║ 
║ 111127 ║ 219 ║ 
║ 111127 ║ 220 ║ 
╚════════╩═══════╝ 

我做了一個小島分析這樣的resulsts:

╔════════╦═══════╦═════╗ 
║ ID ║ START ║ END ║ 
╠════════╬═══════╬═════╣ 
║ 111118 ║ 210 ║ 225 ║ 
║ 111126 ║ 205 ║ 225 ║ 
║ 111126 ║ 200 ║ 201 ║ 
║ 111127 ║ 211 ║ 220 ║ 
╚════════╩═══════╩═════╝ 

在這個例子中最好的時間段看是,要麼

205-225 which includes 111118, 111126 or 
211-220 which includes 111118, 111126, 111127 

有關如何完成此任務的任何建議?

+2

什麼開始和結束的手段?他們是幾個月? – AndreDuarte 2014-09-24 17:42:01

+0

歡迎來到Stack Overflow!你可以發佈你的數據庫模式? – tsnorri 2014-09-24 17:44:40

+0

開始和結束是從數據開始起依次代表每個月的數字。說Jan13是205,然後Feb13是206,March13 207等。 – 2014-09-24 17:48:20

回答

1

您需要找到將連續記錄組合在一起的方法。 這裏是一個辦法,我想:

select id, month, 
month - row_number() over (partition by id order by month) as grp 
from yourtable 

其結果是,你的GRP場將在本月列的順序值相同。

後,所有你需要做的就是總結:

select id, min(month), max(month), count(grp) 
from (query above) 
group by id, grp 
+0

你不必按月在這裏劃分,否則+1 – 2014-09-24 18:56:08

+0

同意!糾正。 – vav 2014-09-24 19:04:22