具有日期和类别维度的 SQL 表

Posted

技术标签:

【中文标题】具有日期和类别维度的 SQL 表【英文标题】:SQL table with date and category dimension 【发布时间】: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",这段代码有一个错误

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

【问题讨论】:

【参考方案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 可能会生成日期序列然后加入它会帮助***.com/questions/7824831/… @tlqn 。 . .正确的。问题中的样本数据包含用于结果的所有日期。如果您想填写缺失的日期,我建议(在 Redshift 中)使用calendar 表。

以上是关于具有日期和类别维度的 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

从具有类别和子类别的表中进行选择的 SQL 查询

查找最佳类别匹配的 SQL 查询

MDX - 到给定日期的总成本

mysql 组 concat 成多个字段

SQL中哪个字段类别记录日期和哪个字段类别记录时间

SSAS - 类别维度 - 未知成员