Использование предложения модели для расширения дат - PullRequest
4 голосов
/ 20 января 2010

У меня есть несколько разных типов данных, относящихся к диапазону дат, которые я хочу объединить, но в то же время разбить по дням. Таким образом, данные за 3 дня приведут к трем строкам:

start    primary_key
start+1  primary_key
start+2  primary_key

Я поиграл, используя предложение модели оператора select в 10g, и искал лучший способ добиться этого. В настоящее время я присоединяюсь к диапазону дат, который охватывает весь диапазон возможных дат (выберите min (дата начала), max (дата окончания)). Я бы предпочел выбрать данные и добавить больше строк, чтобы преобразовать их в набор данных за день.

редактирование:

Мне удалось придумать (теперь включает образцы данных):

    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 ]

2 голосов
/ 20 января 2010

вы можете использовать предложение 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
0 голосов
/ 20 января 2010
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 до сегодняшнего дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...