Comment écrire ces deux requêtes pour un simple entrepôt de données, à l'aide de la norme ANSI SQL?
Je suis en train d'écrire un simple entrepôt de données qui va me permettre d'interroger la table pour observer périodique (disons hebdomadaire) des modifications dans les données, ainsi que des changements dans le changement des données (par exemple, une semaine à modifier dans l'hebdomadaire le montant de la vente).
Pour les fins de simplicité, je vais vous présenter très simplifié (presque banalisé) versions de les tables que je suis ici. Les ventes de la table de données est un point de vue et a la structure suivante:
CREATE TABLE sales_data (
sales_time date NOT NULL,
sales_amt double NOT NULL
)
Pour le but de cette question. J'ai laissé de côté d'autres champs que vous vous attendez à voir - comme product_id, sales_person_id etc, etc, car ils n'ont pas de pertinence directe à cette question. AFAICT, les seuls champs qui seront utilisés dans la requête sont les sales_time et la sales_amt champs (à moins que je me trompe).
J'ai aussi une table de dimension date avec la structure suivante:
CREATE TABLE date_dimension (
id integer NOT NULL,
datestamp date NOT NULL,
day_part integer NOT NULL,
week_part integer NOT NULL,
month_part integer NOT NULL,
qtr_part integer NOT NULL,
year_part integer NOT NULL,
);
qui partition des dates dans les rapports des plages.
J'ai besoin d'écrire des requêtes qui va me permettre de faire ce qui suit:
- Retour de la changement dans semaine sur semaine sales_amt pour une période déterminée. Par exemple, l'écart entre les ventes d'aujourd'hui et de vente N jours - où N est un entier positif (N == 7 dans ce cas).
- Retour de la changement dans le changement de sales_amt pour une période déterminée. Pour en (1). nous avons calculé la semaine sur semaine changement. Maintenant, nous voulons savoir comment le changement est différente de l'
le (la semaine sur semaine) variation calculée la semaine dernière.
Je suis coincé toutefois, à ce stade, que SQL est mon plus faibles compétences. Je vous serais reconnaissant si un SQL maître peut expliquer comment je peux écrire ces requêtes dans une base de données de façon agnostique (c'est à dire à l'aide de la norme ANSI SQL).
OriginalL'auteur morpheous | 2010-05-26
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans le commentaire ci-dessus, je ne comprends pas votre modèle -- donc, ici, est simple pour commencer.
Maintenant, si je veux hebdomadaire des ventes pour l'année civile 2010, les
CalendarYearWeek
est une colonne de dimDate, varchar(8), par exemple "2010-w03',Year
est une colonne de type integer dans dimDate trop.Ne sais pas si c'est proche de ce que vous recherchez, mais peut être un début.
MODIFIER
dimDate a également ces colonnes:
WeekNumberInEpoch, integer -- augmente augmente à partir de quelques époque date dans le passé. Toutes les lignes de dimDate dans la même semaine ont la même WeekNumberInEpoch.
DayOfWeek, de type varchar(10) -- 'dimanche', 'lundi', ...
DayNumberInWeek, integer -- 1-7
Il utilise des expressions de table communes, devrait fonctionner avec la dernière version de PostgreSQL, SQL Server, Oracle, DB2. Pour les autres vous pouvez package les CTE (q_00) dans une sous-requête.
Enfin, c'est la semaine de la semaine de changement que je veux. La requête extrait de code que vous aimablement fourni, indique le (c'est à dire la somme) sur la période. Ce que je veux calculer (par exemple) est le changement entre les ventes d'aujourd'hui et de vente N jours - où N est un entier positif (N == 7 dans ce cas). J'espère que précise ce que je suis en train de faire. aamt
cela semble être exactement ce que je veux faire (à en juger par vos commentaires). J'ai juste besoin de lire (et relire le SQL pour bien comprendre, par exemple, je ne suis pas sûr pourquoi q_00 est à l'aide d'une somme). Une fois que je l'ai testé sur ma db et il fonctionne, je vais accepter ce que la réponse finale - si pas, je reviendrai vers vous avec quelques questions. merci
parce qu'une ligne dans factSales est un chocolat, un élément sur une réception, il y en beaucoup de ces pour un seul jour.
oh, je vois. ok dans ce cas je devrais probablement avoir précisé que j'étais intéressé par la vente d'un produit spécifique (spécifié dans la requête). Par exemple, la requête de revenir semaine de semaine de ventes pour des barres de chocolat. Il semblerait donc que nous n'avons pas besoin de l'agrégation sum (). Espérons que précise ce que j'essaie de faire d'autres. Merci pour votre aide et de vos commentaires.
OriginalL'auteur Damir Sudarevic
Je vous suggère de construire une autre dimension de la table pour le "temps" (un jour par ligne, qui contient des informations sur la répétition de périodes de temps (jour, semaine, mois, trimestre), de sorte que vous pouvez facilement rejoindre/select pour ce type d'informations.
Vos questions pour (1.) et (2.) pourrait être construit de cette façon.
Oui, la plupart des dialectes SQL permettent inférer que de l'information avec la date/heure fonction .. mais ils sont lents (-er) et plus compliqué que d'utiliser une table de dimension ....
Vous poser deux questions (ou peut-être que je l'a étendu à deux): (1) quels DB/conception de données à utiliser (2) comment faire pour interroger les données. Depuis votre sales_data table est très limité (pas de nom d'utilisateur, contractID, ProductID), je suppose que vous êtes à la session de remue-stade de la conception?
+1 pour suggérer la date de table de dimension. J'ai mis à jour ma question à la lumière de vos commentaires.
OriginalL'auteur lexu