J'ai deux tables avec le schéma suivant:changement de calcul (sur une période) pour un champ daté
CREATE TABLE sales_data (
sales_time date NOT NULL,
product_id integer NOT NULL,
sales_amt double NOT NULL
);
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,
);
Je veux écrire deux types de requêtes qui me permettent de calculer:
- période de changement de période (par exemple la semaine sur le changement de semaine)
- changement de période de changement de période (par exemple, changement de la semaine sur le changement de semaine)
Je préférerais écrire ceci en ANSI SQL, puisque je ne veux pas être lié à un db particulier.
[Modifier]
À la lumière de certains commentaires, si je dois être lié à une base de données unique (en termes de dialecte SQL), il devra être PostgreSQL
Le requêtes Je veux écrire sont de la forme (pseudo SQL bien sûr):
Query Type 1 (Period on Period Change)
=======================================
a). select product_id, ((sd2.sales_amt - sd1.sales_amt)/sd1.sales_amt) as week_on_week_change from sales_data sd1, sales_data sd2, date_dimension dd where {SOME CRITERIA)
b). select product_id, ((sd2.sales_amt - sd1.sales_amt)/sd1.sales_amt) as month_on_month_change from sales_data sd1, sales_data sd2, date_dimension dd where {SOME CRITERIA)
Query Type 2 (Change in Period on Period Change)
=================================================
a). select product_id, ((a2.week_on_week_change - a1.week_on_week_change)/a1.week_on_week_change) as change_on_week_on_week_change from
(select product_id, ((sd2.sales_amt - sd1.sales_amt)/sd1.sales_amt) as week_on_week_change from sales_data sd1, sales_data sd2, date_dimension dd where {SOME CRITERIA)
as a1),
(select product_id, ((sd2.sales_amt - sd1.sales_amt)/sd1.sales_amt) as week_on_week_change from sales_data sd1, sales_data sd2, date_dimension dd where {SOME CRITERIA) as a2)
WHERE {SOME OTHER CRITERIA}
La plupart des bases de données implémentent différemment la gestion des dates, chacune utilisant des fonctions différentes pour manipuler les dates. Par conséquent, il est difficile d'écrire une approche «toutes bases de données» pour votre question. De plus, je ne suis pas tout à fait sûr de ce que vous recherchez, j'ai inclus des exemples de données et les résultats attendus de la requête que vous voulez. –
TBH, votre schéma n'est déjà pas applicable à tous les produits de base de données. Par exemple, SQL Server 2005 entre autres n'implémente pas un type de données 'date' et SQL Server en général n'implémente pas un type de données nommé' double' bien qu'il implémente un équivalent appelé 'float'. – Thomas
@Thomas, SQL Server 2008 a un type de données 'date' ainsi qu'un type de données' time', voir: http://msdn.microsoft.com/en-us/library/ms187752.aspx, mais encore une fois, cette montre simplement à quel point chaque base de données et même la version d'une base de données peuvent être différentes. –