2010-01-20 7 views
4

J'ai différents types de données impliquant une plage de dates que je souhaite fusionner, mais en même temps, ventilées par jour. Donc, un 3 jours donnée entraînerait trois lignes:Utilisation de la clause de modèle pour développer des dates

start primary_key 
start+1 primary_key 
start+2 primary_key 

Je joue autour de l'utilisation de la clause type de l'instruction select dans 10g et cherchais la meilleure façon d'y parvenir. Actuellement, je rejoins une gamme de dates qui couvre l'ensemble des dates possibles (sélectionnez min (date de début), max (date de fin)). Je préférerais sélectionner les données et ajouter plus de lignes pour les transformer en ensemble de données par jour.

modifier:

J'ai réussi à trouver (comprend maintenant des exemples de données):

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; 
+0

Que diriez-vous de donner les commandes CREATE TABLE et INSERT et d'indiquer ce que vous attendez réellement. –

Répondre

2

vous pouvez utiliser la clause type pour générer des lignes, voici un petit exemple:

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
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 

vous donnera la liste de toutes les dates de Jan 1st, 2009 jusqu'à aujourd'hui.

+0

Mais si j'ai des données telles que: 01/01/10 au 03/01/10 01/02/10 au 03/02/10 Et je veux finir avec 6 lignes, j'ai encore besoin de calculer combien dates à fabriquer, puis rejoindre à travers, ce qui n'est pas ce que j'essaie d'atteindre – Chris

Questions connexes