求大牛帮忙写千万条数据统计的SQL

懒得搭理你 2012-04-09 11:08:23
现在,我的数据的一张表中存了大约一千万条数据,格式如下:第0列 主键 第1列 区站号 第2列 站名 第3列 纬度 第4列 经度 第5列 台站高度 第6列 年 第7列 月 第8列 日 第9列 积雪深度
问题:查询连续积雪日数大于X天的地区
我的思路是这样的:首先对区站号建立索引,然后利用游标对表进行操作,循环统计。但这样好像效率很低啊。求思路
...全文
128 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ssdd273381952 2012-04-11
  • 打赏
  • 举报
回复
间断孤岛问题
wujianfeng32 2012-04-11
  • 打赏
  • 举报
回复
我觉得添加累计积雪天数是最好的选择。

ssdd273381952 2012-04-11
  • 打赏
  • 举报
回复
用row_number()over()函数解决。
表结构:

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
gogodiy 2012-04-10
  • 打赏
  • 举报
回复
连续积雪日数,其实就是求间断的问题。楼主可以搜索下求间断的代码,另外最好年、月、日三个字段外还有一个完整日期格式的字段。
daiyueqiang2045 2012-04-10
  • 打赏
  • 举报
回复
我是个菜鸟。
我想从程序角度,给一个想法。
如果你这个问题经常需要查询的话,可以添加一列累计积雪天数。
当添加记录时,判断同一地区,上一天的积雪深度是否大于0,添加累计积雪天数。

查询时,直接根据累计积雪天数,查询大于X天的地区 取distinct

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧