2013-09-29 113 views
5

我想知道如何使用循環來填充缺失日期的值爲零的基礎上的開始/結束日期在SQL組中,這樣我有連續的時間序列在每組。我有兩個問題。如何填寫表中的組中的缺失日期sql

  1. 如何爲每個組循環?
  2. 如何使用每組的開始/結束日期來動態填入缺失的日期?

我的輸入和預期輸出如下所示。

輸入:我有一個表。類似的

date  value  grp_no 
8/06/12 1   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/12/12 3   2 

我也有其可用於留下了一個連接以填充缺少的日期表B中。

date 
... 
8/05/12 
8/06/12 
8/07/12 
8/08/12 
8/09/12 
8/10/12 
8/11/12 
8/12/12 
8/13/12 
... 

如何使用A和B在sql中生成以下輸出?

輸出:

date  value  grp_no 
8/06/12 1   1 
8/07/12 0   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/09/12 0   2 
8/10/12 0   2 
8/11/12 0   2 
8/12/12 3   2 

請給我你的代碼和建議。非常感謝你提前!

+0

什麼是B柱? – mhn

+0

它只有一個日期欄 - 2012年的所有連續日期。 – user2824423

+1

您使用的數據庫系統和版本是什麼? –

回答

6

你可以像下面這樣做沒有循環

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no 
    FROM 
(
    SELECT grp_no, date 
    FROM 
    (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date 
     FROM tableA 
    GROUP BY grp_no 
) q CROSS JOIN tableb b 
    WHERE b.date BETWEEN q.min_date AND q.max_date 
) p LEFT JOIN TableA a 
    ON p.grp_no = a.grp_no 
    AND p.date = a.date 

最裏面的子查詢爭奪分鐘,每組最多的日期。然後與TableB交叉加入,在每個組的最小 - 最大範圍內生成所有可能的日期。最後,外部選擇使用外部連接TableA和填充value列與0日期在TableA缺少的日期。

輸出:

 
|  DATE | VALUE | GRP_NO | 
|------------|-------|--------| 
| 2012-08-06 |  1 |  1 | 
| 2012-08-07 |  0 |  1 | 
| 2012-08-08 |  1 |  1 | 
| 2012-08-09 |  0 |  1 | 
| 2012-08-07 |  2 |  2 | 
| 2012-08-08 |  1 |  2 | 
| 2012-08-09 |  0 |  2 | 
| 2012-08-10 |  0 |  2 | 
| 2012-08-11 |  0 |  2 | 
| 2012-08-12 |  3 |  2 | 

這裏是SQLFiddle演示

+0

非常感謝!我會今天嘗試,讓你知道它是否有效! – user2824423

+1

它工作完美!非常感謝。 – user2824423

+0

@ user2824423非常歡迎。祝你好運:) – peterm

相關問題