现在,我的数据的一张表中存了大约一千万条数据,格式如下:第0列 主键 第1列 区站号 第2列 站名 第3列 纬度 第4列 经度 第5列 台站高度 第6列 年 第7列 月 第8列 日 第9列 积雪深度
问题:查询连续积雪日数大于X天的地区
我的思路是这样的:首先对区站号建立索引,然后利用游标对表进行操作,循环统计。但这样好像效率很低啊。求思路
问题:查询连续积雪日数大于X天的地区
我的思路是这样的:首先对区站号建立索引,然后利用游标对表进行操作,循环统计。但这样好像效率很低啊。求思路
我想从程序角度,给一个想法。
如果你这个问题经常需要查询的话,可以添加一列累计积雪天数。
当添加记录时,判断同一地区,上一天的积雪深度是否大于0,添加累计积雪天数。查询时,直接根据累计积雪天数,查询大于X天的地区 取distinct
表结构:Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
PK_ID NUMBER(19)
AREAID VARCHAR2(200) Y
SNOWDEPTH NUMBER(16,2) Y
SNOWDATE DATE Y 测试数据:insert into t_snowdata values(1,11,1.0,to_date('2012-01-01','yyyy-MM-dd'));
insert into t_snowdata values(2,12,1.0,to_date('2012-01-01','yyyy-MM-dd'));
insert into t_snowdata values(3,12,1.0,to_date('2012-01-02','yyyy-MM-dd'));
insert into t_snowdata values(4,11,0.0,to_date('2012-01-02','yyyy-MM-dd'));
insert into t_snowdata values(5,11,4.0,to_date('2012-01-03','yyyy-MM-dd'));
insert into t_snowdata values(8,11,3.0,to_date('2012-01-04','yyyy-MM-dd'));
insert into t_snowdata values(7,11,1.0,to_date('2012-01-06','yyyy-MM-dd'));
insert into t_snowdata values(6,11,0.0,to_date('2012-01-05','yyyy-MM-dd'));SQL:select max(t2.num) maxNum,areaId from (
select count(diff) num,areaId from
(select areaId,snowDate-row_number()over(partition by areaId order by snowDate asc) as diff from t_snowdata where snowDepth>0)t
group by diff,areaId
)t2
group by areaId运行结果:
maxNum areaId
1 2 11
2 2 12