用于Datawarehousing的SQL查询

时间:2018-03-19 10:54:32

标签: sql

我对DWH的SQL查询有疑问。我的维度表中有月份和年份列以及我的事实表中的销售价值,我想查找特定年份第三季度的销售额。对此有什么SQL查询?

2 个答案:

答案 0 :(得分:0)

SELECT fact.sales_value FROM fact_sales
INNER JOIN dim_month ON (... your join here ...)
WHERE
   dim_month.month IN ( 7,8,9 ) 
AND
   dim_month.year = <yourYear>

如果你有更多这样的查询,你可以考虑一个starflake-schema,你有dim_month,dim_quartar,dim_year等,而不是在一个维度表中合并月份和年份。

答案 1 :(得分:0)

如果您的事实表将日期列作为日期维度的外键,则可以按日期直接过滤。

CREATE TABLE Date (
    Date DATE PRIMARY KEY,
    Year INT,
    Quarter INT,
    Semestre INT,
    FiscalYear INT,
    IsEndOfMonth BIT,
    --... other metrics
    )

CREATE TABLE Fact (
    SaleID INT,
    --... other metrics
    Date DATE,
    FOREIGN KEY (Date) REFERENCES Date (Date))


SELECT
    *
FROM
    Fact F
WHERE
    F.Date >= '2018-10-01' AND -- No need to access the Date dimension in this case
    F.Date < '2019-01-01'

如果您的维度表具有代理键,并且该事实通过此键链接到您的日期维度,那么唯一可能的过滤器将是加入两者并过滤日期表。

CREATE TABLE Date (
    DateID INT PRIMARY KEY, -- Auto-generated number, not related to the actual date information
    Date DATE UNIQUE,
    Year INT,
    Quarter INT,
    Semestre INT,
    FiscalYear INT,
    IsEndOfMonth BIT,
    Month INT,
    --... other metrics
    )

CREATE TABLE Fact (
    SaleID INT,
    --... other metrics
    DateID INT,
    FOREIGN KEY (DateID) REFERENCES Date (DateID))


SELECT
    *
FROM
    Fact F
    INNER JOIN Date D ON F.DateID = D.DateID
WHERE
    D.Month IN (10, 11, 12) AND
    D.Year = 2018

性能时间在很大程度上取决于行数,索引,函数调用和查询复杂性。