2014-01-20 80 views
1

我有兩個表{示例數據 - 表A有幾百行,表B有幾千行}。我想用列B1和列A2之間的最小絕對差值填充列B2 - 對應於列A1。 ...或...設置B2 = A1其中abs(B1-A2)最接近於零。SQlite根據兩個表格的最近差異定義列(vlookup)

因此,在我的表格下面的第一行B1 - A2 = 1.6 - 1.4 = 0.2,這是最小的差異,在A1中對應於0(接下來的兩行爲1和2,儘管這個巧合誕生了我缺乏創造力而不是實際的表格結構)。

表A

A1   A2 
0   1.4 
1   2.6 
2   4.3 

表B

B1   B2 
1.6  [] 
2.7  [] 
4.4  [] 

或B2 = A1其中,abs(B1-A2)最接近零。我不知道如何使用SQLite來定義這個。我已經通過搜索,但沒有發現這個問題措辭足夠接近我的微薄的SQLite技能,使跳躍。最近我看到的是SQLite - getting closest value,但這是一張表,只有一個選擇不是更新。

我知道大多數人更喜歡我提供一個答案作爲一個出發點,但他們要麼完全失敗,要麼給我一個關於嘗試使用聚合函數(min)的錯誤,所以我認爲這不會對問題有所幫助(但如果你很好奇,我已經在這上面花了2個小時)。所以我解決這個問題:有沒有辦法讓SQLite執行此操作?任何幫助深表感謝!

B2 = A1其中abs(B1-A2)最接近零。實際上,這是一個SQLite查找(Excel)風格的問題。

回答

1

對於一個固定的B1值稱爲X,該查詢將計算的差異爲每一個記錄:

SELECT *, 
     abs(X - A2) 
FROM A 

要獲得的最小值,我們可以使用MIN,但這只是計算的差異本身。 從相同的記錄讓其他的值,它是更好地使用ORDER BY,這樣,使得第一返回的記錄是一個具有最小差異:

SELECT A1, 
     A2, 
     abs(X - A2) 
FROM A 
ORDER BY 3 

有了一個限制,僅在第一記錄返回:

SELECT A1, 
     A2, 
     abs(X - A2) 
FROM A 
ORDER BY 3 
LIMIT 1 

現在,我們只想要A1值,所以我們環繞此另一個查詢:

SELECT A1 
FROM (SELECT A1, 
      abs(X - A2) 
     FROM A 
     ORDER BY 2 
     LIMIT 1) 

現在我們可以使用這個網絡ntire查詢的相關子查詢的更新,其中X現在是從當前記錄的B1值:

UPDATE B 
SET B2 = (SELECT A1 
      FROM (SELECT A1, 
         abs(B1 - A2) 
       FROM A 
       ORDER BY 2 
       LIMIT 1)) 
+0

什麼了豐富的信息 - 謝謝。 – deroses