sql - 用于创建表的 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
请回答以下问题:
- 定义创建 Fact_Events 表的步骤
- 为每个步骤提供输出表。
- 为每个步骤编写查询。
- 你会使用什么加载方法?
我非常感谢任何帮助,因为我希望为未来的工作面试学习。
提前致谢,
我愿意。
/***这是我的答案/
请告诉我我是否正确或是否有更好的解决方案,
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'
我会使用增量加载,第一次我们将在所有数据上运行脚本并保存表,从现在开始,我们将只连接保存的表中不存在的新事件。
解决方案
加载查询已经结束。您需要分组和旋转。
应该是这样的:
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)
推荐阅读
- javascript - 如何在具有动态时间范围的 d3 scaleTime 中始终具有相同大小的刻度
- android - Location.distanceBetween 显示 0
- django - Python3/Django。将项目目录与环境目录分开
- css - 在 CSS 中使用边距时,什么是可扩展的高级方法?
- android - Android PIE 安全异常
- python - /register 处的 ValueError:必须设置给定的用户名
- c++ - Boost 1.65.1 序列化到向量失败,并出现“Assertion initialized_ failed”
- r - 如何取消嵌套 data.table 嵌套字段?
- react-native - 视图样式在 React Native 中不起作用
- php - 我们如何从给定数组中获取整数值