2013-09-29 75 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