theta连接

 

 我的图表含有两列:persnr和tmstmp, 我怎样在选择子句中不用select(...) 的情况下, 计算每个persnr的最后两个timestamp的差别?

发表于04年8月9日

  有其它方法可以解决这个问题。使用theta连接的简单方法也可以,由于不明数学原因它被称为theta连接,这意味它是很简单的, 因为它不是同等连接。连接条件包含不平等, 在这个情况下是“小于”比较, 而不是平等比较。
select t1.persnr  
     , t1.tmstmp     as second_last_timestamp
     , max(t2.tmstmp)   as last_timestamp
  from yourtable t1
inner
  join yourtable t2
    on t1.persnr = t2.persnr
   and t1.tmstmp < t2.tmstmp     
group
    by t1.persnr
     , t1.tmstmp
having count(*) = 1

  首先, 这个theta连接是一个自我连接, 即图表连接它自己。更准确地说,第一个条件限制这个连接,这样只有同样的persnr的行可以互相连接。第二个条件只接受第一个timestamp少于第二个的可能的组合。

  如果第二个条件不清楚地话,请看这个例子,假设我们有5, 7, 9, 和37的值,要做“自我连接”,我们得到:
 5   5
 5   7
 5   9
 5  37
 7   5
 7   7
 7   9
 7  37
 9   5
 9   7
 9   9
 9  37
37   5
37   7
37   9
37  37

  现在我们加上不平等条件,第一个值必须少于第二个值。
5   7
 5   9
 5  37
 7   9
 7  37
 9  37
  有超过一半的组合都被滤掉了, 在同等连接条件下还应有更多的组合。

  现在我们加入最后的条件,将每组数字按照第一个数字排序分组。我们看到HAVING子句,只得到只有含有一行的组。结果只有一个这样的组。

9  37

  通过采用HAVING子句, 我们可以确保每个t1值只有一个t2值对应。再继续在SELECT列表处的t2值采用MIN()或MAX()函数。查寻就会将每个persnr的最后一个timestamp和倒数第二的timestamp分开。

  剩下要做的事情是将计算最后的timestamp:max(t2.tmstmp) 和倒数第二的timestamp:t1.tmstmp 的差异的表达式加到SELECT列表中。因为timestamp的日期差异函数在不同的数据库系统中差别很大, 所以在这里没有列出来。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值