代码之家  ›  专栏  ›  技术社区  ›  Chris

使用model子句展开日期

  •  4
  • Chris  · 技术社区  · 16 年前

    我有几个不同类型的数据涉及日期范围,我想合并在一起,但同时按天细分。因此,3天的数据将产生三行:

    start    primary_key
    start+1  primary_key
    start+2  primary_key
    

    我一直在使用10g中select语句的model子句,并在寻找实现这一点的最佳方法。目前我加入的日期范围涵盖了所有可能的日期(选择最小(开始日期),最大(结束日期))。我更喜欢选择数据并添加更多的行来将其转换为每日数据集。

    编辑:

    我已经设法想出了(现在包括示例数据):

        SELECT * FROM (
            SELECT 123 req_code, 
                   345 req_par_code, 
                   TO_DATE('01-03-2010', 'dd-mm-yyyy') req_start_date, 
                   TO_DATE('05-03-2010', 'dd-mm-yyyy') req_end_date
            FROM dual
    )
    
        MODEL 
            PARTITION BY (req_code)
            DIMENSION BY (0 d)
            MEASURES     (SYSDATE dt, req_par_code, req_start_date, req_end_date)
            RULES ITERATE(365) UNTIL (dt[iteration_number] >= TRUNC(req_end_date[0])) (
                dt[iteration_number] = NVL(dt[iteration_number-1] + 1, TRUNC(req_start_date[0])),
    
                --Copy data across
                req_par_code[ iteration_number ] = req_par_code[0],
                req_start_date[ iteration_number ] = req_start_date[0],
                req_end_date[ iteration_number ] = req_end_date[0]
            )
        ORDER BY dt, req_code;
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Vincent Malgrat    16 年前

    您可以使用model子句生成行,下面是一个小示例:

    SQL> SELECT * FROM t_data;
    
            PK START_DATE  END_DATE
    ---------- ----------- -----------
             1 20/01/2010  20/01/2010
             2 21/01/2010  23/01/2010
             3 24/01/2010  27/01/2010
    
    SQL> SELECT pk, start_date, end_date FROM t_data
      2  MODEL
      3     PARTITION BY (pk)
      4     DIMENSION BY (0 AS i)
      5     MEASURES(start_date, end_date)
      6     RULES
      7     (  start_date[FOR i
      8                   FROM 1 TO end_date[0]-start_date[0]
      9                   INCREMENT 1] = start_date[0] + cv(i),
     10        end_date[ANY] = start_date[CV()] + 1
     11     )
     12  ORDER BY 1,2;
    
            PK START_DATE  END_DATE
    ---------- ----------- -----------
             1 20/01/2010  21/01/2010
             2 21/01/2010  22/01/2010
             2 22/01/2010  23/01/2010
             2 23/01/2010  24/01/2010
             3 24/01/2010  25/01/2010
             3 25/01/2010  26/01/2010
             3 26/01/2010  27/01/2010
             3 27/01/2010  28/01/2010
    
        2
  •  0
  •   Quassnoi    16 年前
    SELECT  TO_DATE('01.01.2009', 'dd.mm.yyyy') + level - 1
    FROM    dual
    CONNECT BY
            TO_DATE('01.01.2009', 'dd.mm.yyyy') + level <= TRUNC(SYSDATE, 'DDD') + 1
    

    会给你所有日期的清单 Jan 1st, 2009 直到今天。

    推荐文章