0

比方说,我有一个事实表和员工“层”表。

所以事实表看起来有点像

employee_id    call    date
Mark           1       1-1-2017
Mark           2       1-2-2017
John           3       1-2-2017

然后需要有一个“层级”的数据结构——一个缓慢变化的维度表。我想保持简单——我可以将此表的结构更改为任何结构,但现在我已经创建了它。

employee_id   tier1_start ... tier2_start ... tier3_start
Mark           5-1-2016
John           6-1-2016         8-1-2016
Lucy           6-1-2016                       10-1-2016

两个重要的注意事项。该表的运行假设是晋升只会发生一次 - 也就是不会发生降级和再晋升。此外,有可能从第 1 层跳到第 3 层。

我试图想出最好的查询来为事实表提供一个“层”维度(非规范化)。

例如,我想查看 2 月的第 1 层指标,或 2 月的第 2 层指标。显然,历史变化的层级维度必须联系起来。

我现在能想到的最笨拙的方法......只是使用employee_id在层表上加入事实表。

然后,做一个更笨拙的 case 语句:

case
when isnull(tier3_start,'0') < date then 'T3'
when isnull(tier2_start, '0') < date then 'T2'
when isnull(tier1_start, '0') < date then 'T1'
else 'other'
end as tier_level

是的,正如您所看到的,这非常笨拙。我在想也许我需要稍微改变一下它的结构。

4

1 回答 1

1

您最好将您的层表一分为二。

所以有一个这样的层表:

TierID    Tier
------------------
1         Tier 1
2         Tier 2
3         Tier 3

还有一个 EmployeeTier 表:

ID    EmpID    TierID    TierDate
---------------------------------------
1     1        1         Jun 1, 2016
2     1        3         Oct 2, 2016
3     2        1         Jul 10, 2016
4     2        2         Nov 11, 2016

现在您可以查询 EmployeeTier 表并根据您要查找的 TierID 进行筛选。

这也使您能够多次提升/降级。您只需按员工筛选并按日期排序即可找到当前层。

于 2017-03-17T23:53:48.700 回答