2014-09-24 49 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