【发布时间】:2020-10-08 14:14:58
【问题描述】:
我正处于重新设计我们的数据仓库的初期阶段,发现时态表是一种非常棒的 SCD 类型 4 方法。数据仓库的这个迭代将具有日期维度,以便我们可以进入时间点使用业务逻辑进行比较(例如比较财政季度中的特定日期)。日期维度将具有各种酷的业务时间标记,例如财政年度/季度/月和月/季度/年中的日期,以及各种其他开始和结束日期标志,指示不同的业务流程和“季节”。
我看到的唯一问题是,我看不到如何在查询中利用日期维度,而不总是使用单独的日期字段并将查询作为“for system_time all”执行。这是因为您无法对 'for system_time' 语句之后的日期进行任何操作。
现在我知道您可以看到日期是一个变量,并且您可以在设置变量时进行操作。我遇到的问题是 Tableau 不允许您执行 sql 脚本(就像 power BI 一样),只能执行单个语句。所以,我不能有一个我们根据查询结果将日期设置为变量的场景。因此,我不确定如何运行时间查询来让我们获取特定财政季度的这一特定日期的值。希望这是有道理的。
如果我必须使用触发器手动创建历史表,我会这样做,但我认为我的谷歌搜索尚未找到更好的解决方案。有什么想法或文章可以指点我吗?
编辑添加示例:
例如,假设我们有一个包含几个字段的日期维度 (dateTable):
date
fiscalYear
fiscalDayOfYear
现在假设我有一个包含几个字段的表 (statusTable):
userid
status
date (FK to date dimension)
现在假设我想比较 2019 和 2020 财年第 20 天的特定用户状态。如果不使用临时表,它看起来像:
select st.userid, st.status from statusTable st inner join dateTable dt on st.date = dt.date where dt.fiscalDayOfYear = '20' AND (dt.fiscalYear = '2020' or dt.fiscalYear = '2019')
现在如果 statusTable 是一个临时表,它会变成这样:
userid
status
systemtimeFrom (generated by temporal table)
systemtimeTo (generated by temporal table)
我将如何使用时态表执行上述查询中的操作?除了系统时间字段之外,我还看到人们将字段“日期”放入状态表的示例。它们具有自动生成的值。因此,理论上,我可以像在上面的查询中那样加入。我看到的问题是,如果我在没有时间约束的情况下查询临时表,它只会查看最新状态(因为这就是表中的全部内容)。如果我想包含历史和当前表,我想我需要做一个包含“FOR SYSTEM_TIME ALL”的选择,我觉得这消除了时态表的好处(因为你不能做很酷的时间切片时态查询)。
我想知道是否有一种方法可以使用我不知道的某种魔法对时态表进行上述查询。我希望能够做类似的事情(我知道这不是有效的 SQL,因为您只能在 as of 子句中提供日期或变量):
select st.userid, st.status from statusTablest st for system_time as of (select date from datetable where dt.fiscalDayOfYear = '20' AND (dt.fiscalYear = '2020' or dt.fiscalYear = '2019'))
抱歉,我知道这不是一个很好的例子。我没有太多的例子,因为我是从头开始设计的。我希望我能得到我想要做的事情。如果不是,请告诉我,我可以尝试用不同的方式说出来。
【问题讨论】:
-
“获取特定会计季度这一特定日期的值”:因此您在“会计季度”='x' 和“会计季度日”= n 上过滤您的日期维度。看起来很简单,这表明我可能误解了你的问题 - 你能澄清一下吗?
-
所以时间切片的工作方式是,您需要获取所有记录(当前+历史记录)才能正常工作,不是吗?否则 "Fiscal Quarter" = 'x' 和 "Day of Fiscal Quarter" = n 将仅应用于当前表而忽略历史记录。我对它的理解可能是错误的。这有助于澄清吗?
-
我认为这个链接解释了如何使用临时表而不是更标准的 SCD2 表:docs.microsoft.com/en-us/sql/relational-databases/tables/… 如果这个链接不能回答你的问题,请你解释一下(用例子)你想要什么查询您期望的数据和结果?
-
感谢您的回复。它没有回答我的问题,因为它不使用时间维度。我没有例子,因为我还没有这样做。让我试着想点什么,我会再回复的。
-
我编辑了我的问题以包含一个示例。感谢@NickW 为您(或任何人)提供的任何帮助!
标签: tsql tableau-api data-warehouse temporal-tables