2014-03-31 74 views
-2

我有一個表:如何將缺失的日期添加到結果表中?

accdate (DATETIME) | value (INT) 
-------------------+------------ 
        | 

的ACCDATE列包含小時的粒度數據集。這意味着,日期格式爲YYYY-mm-dd HH:00:00。如果我使用SELECT * FROM mytable ORDER BY accdate ASC查看錶格,我會通過accdate獲得一個有序表格。但mytable不包含第一行和最後一行之間的所有可能的日期和時間(某些日期在我的程序未運行的時候丟失)。我想爲第一行和最後一行之間的所有可能的日期+小時組合設置默認值。

我知道這可以通過使用另一個表的LEFT JOIN解決,該表包含此範圍內的所有可能日期。 但是,我如何在SQL語句中構造這樣的表?我認爲用僞數據填充表是不合理的,如果我可以解決查詢中的問題。

實施例:

accdate (DATETIME) | value (INT) 
---------------------+------------ 
2011-11-11 19:00:00 | 50 
2011-11-11 20:00:00 | 53 
2011-11-11 22:00:00 | 16 
2011-11-12 06:00:00 | 15 
2011-11-12 07:00:00 | 150 

日期2011-11-11 21點00分○○秒和缺少23日下午和上午05點之間的範圍內。對於這些日期,結果表中應該有一行(在值列中包含0)。

我希望你能理解我的問題。如果有什麼不清楚的地方,請發表評論。謝謝。

+0

你不能有一個單一查詢「製造」包含全套的假表數據加入反對。這不是查詢的工作。這就是爲什麼通常的解決方案是創建一個臨時表,填入所有的日期然後加入。創建該表不是數據庫服務器的工作。是你的。如果您只是爲了顯示目的而需要這些缺失值,那麼只需在顯示代碼中填入空格。 –

+0

爲什麼我會得到降價?我只是想知道一些事情,並試圖描述它很好。如果你認爲它有問題,那麼投票結束或刪除 – 0xDEADBEEF

+0

我還沒有降票,但我懷疑你是從錯誤的方向去解決這個問題。 –

回答

0

我能想到的唯一方式是使用左用相同的表連接,增加了所需的字段的加入,聯盟與實際結果的結果,完成設置:

示例設置:

CREATE TABLE tmp (
    id INT IDENTITY, 
    number INT 
); 

-- insert some incomplete sequenced values 
INSERT INTO tmp (number) VALUES(1); 
INSERT INTO tmp (number) VALUES(3); 
INSERT INTO tmp (number) VALUES(4); 

例子查詢:

-- select your actual data 
SELECT number 
FROM tmp 

UNION 

-- select the missing data 
SELECT a.number + 1 
FROM tmp a 
LEFT JOIN tmp b ON a.number + 1 = b.number 
WHERE b.id IS NULL 

-- order the complete set 
ORDER BY number ASC; 

如果你有你的結果(例如:1之間的一個以上的缺失值這將無法正常工作4),但如果你的數據在每個結果之間只有一小時沒有結果,這就像一個魅力。

0

使用SQLite 3.8.3或更高版本,可以使用common table expression生成值無中生有:

WITH RECURSIVE AllDates(accdate) 
AS (VALUES('2011-11-11 00:00:00') 
    UNION ALL 
    SELECT datetime(accdate, '+1 hour') 
    FROM AllDates 
    WHERE accdate < '2011-11-12 10:00:00') 
SELECT AllHours.accdate, 
     MyTable.value 
FROM AllHours 
LEFT JOIN MyTable USING (accdate)