具有日期和类别维度的 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 表的主要内容,如果未能解决你的问题,请参考以下文章