2017-07-24 2 views
0

Je suis vraiment nouveau à Teradata. Je me demande si Teradata pourrait me permettre de faire les fonctionnalités suivantes. J'ai un produit A qui a un historique de volume réel du 10/06/2016 au 24/07/2017 (aujourd'hui).Teradata: créer des lignes et du contenu pour les données historiques

Date    Volume 
10/06/2016   10 
.     . 
.     . 
.     . 
07/24/2017   50 

Quand je tire le réel pour ce produit (code: sélectionnez A.volume la base de données où la date entre 20161006 et 20170724), comment pourrais-je écrire le code si je veux ajouter 2016010-20161005 lignes et faire leur le volume est "0"?

Date    Volume 
01/01/2016   0 
01/02/2016   0 
.     . 
.     . 
.     . 
10/05/2016   0 
10/06/2016   10 
.     . 
.     . 
.     . 
07/24/2017   50 

J'ai plusieurs produits (1000+) qui ont besoin de cette fonction. Cependant, je ne suis pas en mesure d'énumérer les noms ensemble. Est-ce que je peux le faire pour tous les produits?

Merci beaucoup!

+0

Essayez-vous d'afficher un volume de 0 pour lequel vous n'avez pas de ligne pour une date spécifique? – Andrew

+0

Y a-t-il une ligne par produit/date, éventuellement des rangées consécutives de même volume? Ou plages de dates avec le même volume? Btw, si vous n'avez pas vendu le produit avant 20161006 retournant zéro n'est pas correct imho. – dnoeth

+0

@Andrew Merci Andrew! J'essaie de montrer un volume de 0 à partir du 01/01/2016 jusqu'à la 1ère date disponible réelle. –

Répondre

0

Cela crée les lignes manquantes:

-- find the range of missing dates and expand it to one row per product/date 
SELECT product, Begin(pd), 0 AS volume 
FROM 
( 
    SELECT 
     product, 
     Min(datecol) AS pd_end, 
     -- double cast needed as LEAST is not implemented for DATEs 
     Cast(Least(Cast(pd_end AS INT) 
       ,Cast(DATE '2016-10-01' AS INT)) AS DATE) AS pd_begin 
    FROM inventory AS i 
    GROUP BY 1 
    -- only those with missing dates 
    HAVING pd_end > pd_begin 
) AS dt 
EXPAND ON PERIOD (pd_begin, pd_end) AS pd 

maintenant UNION ALL votre SÉLECT.

+0

Merci @dnoeth! Comment est-ce que je traiterais la date pour le code suivant si le datecol est comme 20.140.101.00, qui devrait signifier (2014/01/01)? Min (datecol) AS pd_end, - une double conversion est nécessaire car LEAST n'est pas implémenté pour les DATE Cast (au moins (Cast (pd_end AS INT) , Cast (DATE '2016-10-01' AS INT)) EN DATE) AS pd_begin –

+0

@XinDu: Quel est le type de données de '20.140.101.00'? – dnoeth

+0

grâce @dnoeth il est un type de données que le nombre, je pense ... –