2014-10-18 70 views
1

我有一個非常大的表有時間戳和值V.一些在VS的可能爲空:選擇最接近的非空值時間戳

timestamp,V 
sometime_1,value1 
sometime_2,value2 
sometime_3,NULL 
sometime_4,value4 

我想查詢中選擇的V值定的時間戳T,但如果是NULL,讓我的價值在對T的兩側例如叔最接近的時候,如果我有

2010-09-01 00:00:01,v1 
2010-09-01 00:00:02,v2 
2010-09-01 00:00:03,NULL 
2010-09-01 00:00:04,NULL 
2010-09-01 00:00:05,v3 

我要爲時間戳查詢「3」返回「v2」,因爲2比5更接近3,但會希望時間戳「4」的查詢返回v3,因爲5更接近。

時間不能保證是連續或者,例如,我們可能有:

2010-09-01 00:00:01,v1 
2010-09-01 00:00:04,v2 
2010-09-01 00:00:30,NULL 
2010-09-01 00:00:42,NULL 
2010-09-01 00:00:50,v3 

在這種情況下,v3是最接近這兩個30和42

目前,我正在做這通過將Python連接到SQL並從相關時間戳的兩個方向啓動for循環,並返回不返回NULL的最接近的值。但是如果我可以在SQL中執行此操作,則會更清晰。我不能寫一個存儲過程;這必須是單個查詢。

我這樣做是因爲我需要給定時間戳的最接近(臨時)有效值,但有時該值對於時間戳爲NULL。

+0

你使用的是什麼dbms?主要問題編輯爲 – jazzytomato 2014-10-18 17:22:20

+0

。 – Tommy 2014-10-18 17:23:22

回答

2

到@par解決方案,但隨着時間的推移類似:

SELECT v 
FROM (
(SELECT v, TIMEDIFF(T, `timestamp`) AS tdiff 
    FROM table_name 
    WHERE `timestamp` <= T AND v IS NOT NULL 
    ORDER BY `timestamp` DESC 
    LIMIT 1) 
UNION ALL 
(SELECT v, TIMEDIFF(`timestamp`, T) AS tdiff 
    FROM table_name 
    WHERE `timestamp` > T AND v IS NOT NULL 
    ORDER BY `timestamp` ASC 
    LIMIT 1) 
) u 
ORDER BY tdiff 
LIMIT 1 

這裏T給出時間戳尋找價值V

爲了加快速度,您必須在timestamp列上有索引。

+0

我收到錯誤「UNION和ORDER BY的錯誤用法」 – Tommy 2014-10-22 16:52:43

+0

只要我髮指甲什麼,我想用V和T填寫的確切查詢是在這裏:http://pastebin.com/9Ga2A6Em – Tommy 2014-10-22 16:54:55

+0

更正後:每個'SELECT'子查詢都必須用圓括號括起來 – Rimas 2014-10-22 17:20:37

0

嘗試

SELECT * FROM YourTable WHERE YourTable.value != NULL ORDER BY ABS(queriedTime - YourTable.time) ASC LIMIT 1 

還沒有提供給我當前SQL,所以上面的查詢可能無法正常工作(沒有測試)。

+0

更改了問題;答案將不再起作用。首先將日期時間轉換爲整數。 – parsiad 2014-10-18 17:41:59

0

鑑於時間戳是有序的,您可以執行以下操作。

這裏假設時間戳是整數,但您可以將日期時間轉換爲整數。我沒有測試它,但這個想法是有:

SELECT * FROM 
(
    (SELECT * FROM YourTable WHERE value != NULL && time <= queriedTime LIMIT 1) 
    UNION 
    (SELECT * FROM YourTable WHERE value != NULL && time > queriedTime LIMIT 1) 
) ORDER BY ABS(time - queriedTime) ASC LIMIT 1 
0

您可以創建一個像

SELECT T2.T,T2.V FROM TAB AS T2 WHERE T2.V IS NOT NULL 
UNION 
SELECT T0.T,(
     SELECT T1.V FROM TAB AS T1 WHERE T1.V IS NOT NULL 
     ORDER BY ABS(T0.T-T1.T) LIMIT 1 
     ) FROM TAB AS T0 WHERE T0.V IS NULL; 

一個VIEW

ORDER BY ABS(T0.T-T1.T) 
當然

可能返回多個條目時間戳的一模一樣的距離在哪些情況下不同的RDBMS可以按照不同,您的從句最後得到一個不同的值V. 它也取決於您的系統支持子查詢的程度。