帮我设计一个更高效的sql语句

chencliff 发布于 2011/07/18 17:16
阅读 565
收藏 0

数据库一个表,有id,type(类型)和getdate(时间),要求所有type为2的项,计算离它最近的type为1的项的时间差,并统计出这个时间差的最大前十,最短前十,以及平均值。

 

我现在是最原始的方法,select所有type为2的项,查找id离它最近的,然后计算。效率极差。

有没有更有效率的方法?

以下是问题补充:

@chencliff:我现在是查type为2的项,while这个rs 对每项,查离它最近的项,然后计算。 是一个sql,加上循环中的sql,所以很慢 (2011/07/19 10:02)
加载中
1
丁木木
select id,as datecha
from(
select a.id,abs(a.id-b.id) as idcha,as(a.getdate-b.getdate)as datecha
from 
(select id,type,getdate
from table
whre type=2)a,
(select id,type,getdate
from table
where type=1)b
)c
group by a.id
qualify row_number() over(partition by a.id order by idcha desc)
)d
oder by datecha
这个是teradata数据库的,你灵活变通一下,关键是要使用partition。否则就搞不定
0
笨蛋EGG
笨蛋EGG
非常想知道你的这个功能,传说中的原始方法,一个sql语句是怎么写出来的······
0
chencliff
chencliff

一个sql语句不就高效了,我现在是查type为2的项,while这个集合

对每项,查离它最近的项,然后计算。

 

所以,不是一个sql,是一堆循环中的sql

0
hnynes
hnynes
先给出你自己的方法吧,这样也好有个比较,是否比你的高效. 没有比较也就谈不上更高效
0
阿拉法政
阿拉法政

我的想法是加个字段记录离type2最近的type1的id,表建立getdate的索引,然后使用触发器,每插入一条记录根据其为type1还是type2,更改上述字段。总之你的业务逻辑里难度还是确定谁离谁最近。

0
William
William
这个最好写存储过程
0
mark35
mark35

"计算离它最近的type为1的项"

按什么计算,id,date?

0
Z
ZYud

用触发器吧

第一次出现type=1时,放到结果表,放置时间1。

每出现一次type=2,更新结果表的时间2。

0
SueYY
SueYY
干嘛非要用SQL来跑? 这种玩意要么用存储过程,要么用程序。SQL不是万能的
返回顶部
顶部