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的日期差異函數在不同的數據庫系統中差別很大, 所以在這裏沒有列出來。


發佈了1 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章