首页 > 解决方案 > 用于创建表的 SQL ETL - 求职面试问题

问题描述

我对我想要的工作进行了 sql 测试,但不幸的是我没有得到这份工作,

我希望有人可以帮助我为测试中的一个问题提供正确的答案,

所以这是一个问题:

ETL 部分 我们的“事件”表(数据源)是实时创建的。该表没有更新,只有追加。

event_id    event_type  time                user_id    OS           Country
1           A           01/12/2018  15:39   1111       iOS          ES
2           B           01/12/2018  10:43   2222       iOS          Ge
3           C           02/12/2018  16:05   3333       Android      IN
4           A           02/12/2018  16:39   3333       Android      IN

在我们的 DWH 中的 Fact_Events 表下方显示。此表汇总了每小时级别的事件数。ETL 过程每 30 分钟运行一次。

date        hour    event_type_A    event_type_B    event_type_C
01/12/2018  15:00   1               0               0
01/12/2018  10:00   0               1               0
02/12/2018  16:00   1               0               1

请回答以下问题:

  1. 定义创建 Fact_Events 表的步骤
  2. 为每个步骤提供输出表。
  3. 为每个步骤编写查询。
  4. 你会使用什么加载方法?

我非常感谢任何帮助,因为我希望为未来的工作面试学习。

提前致谢,

我愿意。

/***这是我的答案/

请告诉我我是否正确或是否有更好的解决方案,

ETL 部分

1. 为每个事件创建一个表,在这种情况下,我们需要 3 个表,使用 UNION ALL 将所有表连接到一个表。

2.第一步:

date        hour    event_type_A    event_type_B    event_type_C
01/12/2018  15:00   1               0               0
02/12/2018  16:00   1               0               0

第二步:

date        hour    event_type_A    event_type_B    event_type_C
01/12/2018  15:00   1               0               0
02/12/2018  16:00   1               0               0
01/12/2018  10:00   0               1               0

第三步:

date        hour    event_type_A    event_type_B    event_type_C
01/12/2018  15:00   1               0               0
02/12/2018  16:00   1               0               0
01/12/2018  10:00   0               1               0
02/12/2018  16:00   0               0               1
SELECT Date(time) as date,
              Hour(time) as hour,
Count(event_type) as event_type_A,
0 as event_type_B,
0 as event_type_C
FROM Events
WHERE event_type = 'A'

Union All
SELECT Date(time) as date,
              Hour(time) as hour,
0 as event_type_A,
Count(event_type) as event_type_B,
0 as event_type_C
FROM Events
WHERE event_type = 'B'

Union All
SELECT Date(time) as date,
              Hour(time) as hour,
0 as event_type_A,
0 as event_type_B,
Count(event_type) as event_type_C
FROM Events
WHERE event_type = 'C'

我会使用增量加载,第一次我们将在所有数据上运行脚本并保存表,从现在开始,我们将只连接保存的表中不存在的新事件。

标签: sqlsql-server

解决方案


加载查询已经结束。您需要分组和旋转。

应该是这样的:

select Date(time) as date,
       datepart(hour,time) as hour,
       Sum(case when event_type='A' then 1 else 0 end) as event_type_A,
       Sum(case when event_type='B' then 1 else 0 end) as event_type_B,
       Sum(case when event_type='C' then 1 else 0 end) as event_type_C
from Events
group by Date(time), datepart(hour,time)

推荐阅读