【问题标题】:SQL table with date and category dimension具有日期和类别维度的 SQL 表
【发布时间】:2021-02-17 11:35:31
【问题描述】:

我有一个包含日期、类别和值的表格。类似这样:

Date            Category       Sell
01/01/21        Apple           1
01/01/21        Orange          3
01/01/21        Banana          2
02/01/21        Banana          1
03/01/21        Orange          2

我想做的是为每个类别创建一个日期行,即使在没有任何东西出售的那一天也是如此。所需的输出应具有日期和类别的粒度:

Date            Category       
01/01/21        Apple           
01/01/21        Orange          
01/01/21        Banana          
02/01/21        Apple           
02/01/21        Orange          
02/01/21        Banana     
03/01/21        Apple           
03/01/21        Orange          
03/01/21        Banana 

    

我想采用这种格式,但我不确定解决此问题的最佳方法是什么?我对 SQL 很陌生,所以不确定要搜索什么。我正在使用 Redshift SQL。我的想法是创建一个单独的日期表,然后单独的类别表,然后加入它(但也许有更好的方法)?

CREATE TABLE #DateIntervals (
    PeriodStartDate date,
    PeriodEndDate date
)

DECLARE @StartDate datetime = '01/01/2021';

DECLARE @EndDate datetime = DATEADD(DAY, -1, DATEADD(YEAR, 5, @StartDate));

WHILE @StartDate <= @EndDate

BEGIN
    INSERT INTO #DateIntervals (PeriodStartDate, PeriodEndDate)
    SELECT @StartDate, DATEADD(day, 6, @StartDate)

    SET @StartDate = DATEADD(day, 7, @StartDate)
END

但是,正如上面所说的"Invalid operation: syntax error at or near "DECLARE" Position",这段代码有一个错误

如果有人能给我建议,将不胜感激。

【问题讨论】:

    标签: sql date amazon-redshift


    【解决方案1】:

    使用cross join 生成行,然后使用left join 引入数据。第一部分似乎回答了你的问题:

    select d.date, c.category
    from (select distinct date from t) d cross join
         (select distinct category from t) c
    order by d.date, c.category;
    

    要引入现有数据,请使用left join:

    select d.date, c.category,
           coalesce(t.sell, 0) as sell
    from (select distinct date from t) d cross join
         (select distinct category from t) c left join
         t
         on d.date = t.date and c.category = t.category
    order by d.date, c.category;
    

    【讨论】:

    • 非常感谢您提出的解决方案。但是,对于您编写的第一个查询,如果我理解正确,它不会填充没有销售任何类别的日期,对吗?我希望每个类别级别的每个日期都有一行
    • @tlqn 可能会生成日期序列然后加入它会帮助stackoverflow.com/questions/7824831/…
    • @tlqn 。 . .正确的。问题中的样本数据包含用于结果的所有日期。如果您想填写缺失的日期,我建议(在 Redshift 中)使用calendar 表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2015-07-27
    相关资源
    最近更新 更多