【面试题】 "课程订单表”里记录了某在线教育App的用户购买课程的信息(部分数据截图)。 请使用sql将购买记录表中的信息,提取为下表(复购分析表)的格式。并用一条sql语句写出。...该业务分析要求查询结果中包括:日期(说明是按购买日期来汇总数据)、当日首次购买用户数、此月复购用户数,第N月复购用户数。 1.当日首次购买用户数 先来看当日首次购买用户数这一列如何分析出?...select 购买时间, count(distinct 用户id) as 当日首次购买用户数 from 课程订单表 group by 购买时间; 查询结果如下: 2.此月复购用户数 再来看查询结果中的此月复购用户数...(month,a.购买时间,b.购买时间) <=1 then a.用户id else null end ) as 此月复购用户数 from 课程订单表 as a left join 课程订单表...(month,a.购买时间,b.购买时间) =20 then a.用户id else null end ) as 第二十月复购用户数 from 课程订单表 as a left join 课程订单表
对于较为复杂的数据场景,总是绞尽脑汁的用 GROUP BY 和 JOIN 来实现,却不知有类似功能的 SQL 函数。...下面举个栗子,说说我学到的一些 SQL 函数和简化 SQL 的方法,以 Hive SQL 作为模版。代表因为 SQL 函数和语法大多类似,原理通用,在使用其他 SQL 时参考即可。...testCondition为 true 或者非 NULL 时,返回 valueTrue;否则返回 valueFalseOrNull。...GROUPING 使用 ROLLUP 中的一个列作为参数,GROUPING 函数在遇到 ROLL UP 生成的 NULL 值时,返回1。...即如果这一列是个小计或总计时,GROUPING 返回1,否则返回0。它只能用在 ROLLUP 或者 CUBE 的查询里。
该业务分析要求查询结果中包括:日期(说明是按每天来汇总数据)、用户活跃数、N日留存数、N日留存率。 1.每天的活跃用户数 先来看活跃用户数这一列如何分析出?...相机'; 联结后的临时表记为表c,那么如何从表c中查找出时间间隔(明天登陆时间-今天登陆时间)=1的数据呢?...时间间隔from c)group by a.登陆时间; 将临时表c的sql代入上面就得到了查询结果如下: 3.次日留存率 留存率=新增用户中登录用户数/新增用户数,所以次日留存率=次日留存用户数/当日用户活跃数...(day,a.登陆时间,b.登陆时间) as 时间间隔from c) as dgroup by a.登陆时间; 将临时表c的sql代入就是: 查询结果: 4.三日的留存数,三日留存率,七日的留存数...最终sql代码如下: select a.登陆时间,count(distinct a.用户id) as 活跃用户数,count(distinct when 时间间隔=1 then 用户id else null
第一步,查询所有新增注册用户 这一步的核心目的,是锁定我们要分析的“新增注册用户名单”,我们只需从用户注册表(reg)中,提取出“用户ID”和“注册时间”这两列数据即可。...SELECT user_id, register_time FROM reg; 我们可以这样理解这段SQL: 检索 user_id列的数据, register_time列的数据 从注册表(reg)中;...,没有登录数据,所以我们需要用LEFT JOIN(左外连接),将用户行为表(act)与用户注册表(reg)关联起来,这样就能看到每个用户的注册时间和所有登录时间。...= DATE_ADD(r.register_time, INTERVAL 1 DAY); 我们可以这样理解这段SQL: 检索 统计去重后的当日注册用户数 并将统计结果命名为 当日注册用户数; 统计去重后的次日留存用户数...ID相同); 同时,只匹配注册后第二天的登录记录 当我们执行这段SQL后,会得到以下数据表。
将全量数据导入到dw层维度表 set spark.sql.shuffle.partitions=1; --shuffle时的分区数,默认是200个 -- 使用spark sql将全量数据导入到dw层维度表...`itcast_goods` where dt='20190909') ods on dw.goodsId = ods.goodsId; 3、编写spark-sql获取当日数据 -- 今日数据 select...`itcast_goods` where dt = '20190909'; 4、将历史数据、当日数据合并加载到临时表 -- 将历史数据、当日数据合并加载到临时表 drop table if exists...`itcast_goods` where dt = '20190909'; 5、将历史数据、当日数据导入到历史拉链表 -- 将历史数据、当日数据导入到历史拉链表 insert overwrite table...我们最后可以查询到,id为100134的数据有两条,一条数据是之前的历史数据,一条数据是被我们从MySQL修改之后同步到ODS层作为新增数据而出现。
超哥的杂货铺,你值得拥有~ 来看一道SQL题目: 注:以下讨论核心在于解释原理,所涉及到的数据和表结构均为虚构。本文代码较多,如果看不清楚,可以在后台回复“sql”获取本文PDF版本。...但工作中会有这样的场景,不仅仅只是临时取一个数据,而是要开发报表,这需要让写好的SQL根据不同的日期变量,每天执行一下,获得相应的数据。这里有几个问题。...我们用实例来说明,假设今天是0809,那我们应该能得到0808以及之前的数据。对于0802以及之前的数据,它的当日,三日,七日的转化情况已经固定了,不会随着时间进一步更新。...对于0806以及之前的数据,它的当日和三日转化也已经确定。而0803-0808这些天,他们的七日转化数据还没有“到位”,0806-0808,他们的三日转化数据也还没有“到位”,因为时间周期还没到。...我们可以选择将当前最新的数据呈现出来(例如0808的数据,当日,三日,七日是一样的,因为只有当日的数据),也可以选择如果日期还没到可以计算数据的时候,在相应的数据置为0。
用户留存率是电商行业经常用到的指标,用户的留存数指“第一天登录,以后几天还继续登录的用户数”,"留存率=次日的留存数/当日总的用户数"。...a.登录序号 ,a.用户ID ,a.登录日期 as 登录日期a ,b.登录日期 as 登录日期b ,datediff(b.登录日期,a.登录日期) as 间隔天数 from 用户登录表 a left join...SQL语句和结果如下: select dates.登录日期a ,count(distinct dates.用户ID) as 当日用户数 ,count(distinct case when dates....登录日期b, datediff (b.登录日期,a.登录日期) as 间隔天数 from 用户登录表 a left join 用户登录表 b on a.用户ID=b.用户ID and a.登录日期sql语句构建并计算用户的留存数是非常重要的 2、Datediff()函数的应用 Datediff() 函数返回两个日期之间的天数,表达式: datediff
分析出当日浏览房源10套以上并且注册超过一年的用户 【解题思路】 我们用逻辑树分析方法来拆解下问题:当日浏览房源10套以上并且注册超过一年的用户。...这里我们可以看出用户需要满足两个条件: 1)当日浏览房源10套以上,浏览信息在浏览表中 2)注册时间超过一年,注册信息在注册表中 涉及2张及以上表的查询时,需想到《猴子 从零学会SQL》里讲到的,要用到多表联结...这里我们的条件在两边都是需要满足的,所以使用内联结(inner join),两表的联结字段是用户号,如下图所示 两表联结的SQL image.png 两表联结后,再来看题目要求的条件。...image.png 查询结果 【本题考点】 1.涉及到多个表,要想到用多表查询,包括使用哪种联结,使用哪些字段联结。...如何从零学会SQL?
、设备个数等 油站数量:1个油站就是一条数据,这个值默认就为1 已停用油站数量:停用状态,判断油站的状态是什么状态 有效油站数量:使用状态,判断油站的状态是什么状态 当日新增油站:判断之前有没有这个油站...历史记录表:oil_history:记录了当前所有油站的信息 id、name 今日新数据:oil_current:记录了今天所有油站的信息 id、name left join oil_current...a left join oil_history b on a.id = b.id where b.id is null 当日停用油站:判断当日状态 油站设备数量:得到这个油站的所有设备信息,按照油站...one_make_dwd.ciss_base_oilstation_history stored as orc as select * from one_make_dwd.ciss_base_oilstation where dt < '20210102'; 查询历史油站信息...from one_make_dwd.ciss_base_oilstation oil --历史油站数据表 left outer join one_make_dwd.ciss_base_oilstation_history
本文同步发表在数据仓库技术网站dwsql.com 的数仓建模->数据仓库建模案例 下 如果该需求作为面试题目,要求使用非笛卡尔积的方式写SQL,难度应该数据困难,要高过一般的连续问题,所以不要轻易拿去考别人...现希望查询出截止到每日的累积盈利的用户数; 分析: 因为盈利记录表中仅存在当日有交易记录,这样我们进行累积求和的结果是不能满足要求的,这是该题目困难的原因。...,因为如果用户在某天不存在交易,则当日不会有其记录,e.g. 1001 用户在3月14日没有记录,所以接下来我们要使用笛卡尔积来完成缺失数据的补足; 2.通过查询记录表,查到所有的日期,日期与累积求和结果进行笛卡尔积计算...我们写完了,即便按照方法三,没有笛卡尔积的方式,每次查询我们都需要不断的查询所有历史数据,进行一遍遍的开窗和聚合,这在生产过程是不可接受的。...这也是通过存储换计算的方式,也可以理解为空间换时间(存储空间换查询时的查询时间) 创建表 为了方便加工,我们创建两张表 用户每日盈亏表(分区表)(注:该表在实际生产环境,用户每日盈亏表应该就已经是分区表了
另外,在建立维度表时要充分使用代理键,代理键是数值型的ID号码,好处是代理键唯一标识了每一维度成员信息,便于区分,更重要的是在聚合时由于数值型匹配,JOIN效率高,便于聚合,而且代理键对缓慢变化维度有更重要的意义...事实数据表是数据仓库的核心,需要精心维护,在JOIN后将得到事实数据表,一般记录条数都比较大,需要为其设置复合主键和索引,以为了数据的完整性和基于数据仓库的查询性能优化,事实数据表与维度表一起放于数据仓库中...所以SQL更适合在固定数据库中执行大范围的查询和数据更改,由于脚本语言可以随便编写,所以在固定数据库中能够实现的功能就相当强大,不像ETL中功能只能受组件限制,组件有什么功能,才能实现什么功能。...技术缓冲到近源模型层的数据流算法-----常规拉链算法 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据...近源模型层到整合模型层的数据流算法----常规拉链算法 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据
事 实数据表是数据仓库的核心,需要精心维护,在JOIN后将得到事实数据表,一般记录条数都比较大,我们需要为其设置复合主键和索引,以为了数据的完整性和 基于数据仓库的查询性能优化,事实数据表与维度表一起放于数据仓库中...所以SQL更适合在固定数据库中执行大范围的查询和数据更改,由于脚本语言可以随便编写,所以在固定数据库中能够实现的功能就相当强大,不像ETL中功能只能受组件限制,组件有什么功能,才能实现什么功能。...、源系统表基本上完全一致,不会额外增加物理化处理字段,使用时也与源系统表的查询方式相同; 15.技术缓冲到近源模型层的数据流算法-常规拉链算法 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增...; 通常建一张名为VT_NEW_编号的临时表,用于将各组当日最新数据转换加到VT_NEW_编号后,再一次附加到最终目标表; 18.近源模型层到整合模型层的数据流算法-MERGE INTO算法 此算法通常用于无删除操作的常规状态表...19.近源模型层到整合模型层的数据流算法-常规拉链算法 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据
做门店数字化的人大概都遇到过:经营看板刚上线时秒开,数据量一上来,老板点一下"今日销售"要转 3 秒,点"本月各门店对比"直接超时。...AND CURRENT_DATE - 1GROUP BY store_id;当日流水量小(几千条),实时 GROUP BY 毫秒级完成;历史走预聚合表也毫秒级。看板接口把两部分结果合并返回即可。...六、踩坑清单坑现象解法只有预聚合没有当日增量今日数据看不到当日实时算 + 历史预聚合相加按 UTC 计算"当日"凌晨数据串到昨天按门店本地时区分天缓存 key 没有版本号数据更新了看板还显示旧值写入新数据时...,纯 SQL 就能完成;看板并发高再加缓存层。...八、复盘清单历史查询是否走了预聚合表,不再扫流水明细当日数据是否单独增量计算并与历史合并是否按门店本地时区分天缓存是否带版本号、能感知数据更新是否有兜底限制,防止任意大窗口查询结语看板变慢不是数据库不行
ODS层数据是贴源层,是数仓开始的地方,所以这里检验时一般不需要验证与原始数据条目是否相同,在ODS层数据质量监控中一般验证当日导入数据的记录数、当日导入表中关注字段为空的记录数、当日导入数据关注字段重复记录数...:${current_dt_rowcnt},当日检查列为空的记录数:${check_null_rowcnt},当日导入数据重复数:${duplication_rowcnt} ,表总记录数:${total_cnt...=$4# DWD层目标表表名target_tbl=$5# 切割多个源表,查询源表关注字段的总条数tbl_arr=(${ods_tbls//,/ })# 查询源表数据SQL source_sql=""#...//,/ })# 查询DWS表数据SQL check_sql=""# 动态拼接SQL 检查null值条数for((i=0;inull " fidone# 查询SQL 获取DWS表中空值数据记录数null_row_cnt=`hive -e "${check_sql}"`# 查询SQL 获取校验值异常记录数
另外,在建立维度表时要充 分使用代理键,代理键是数值型的ID号码,好处是代理键唯一标识了每一维度成员信息,便于区分,更重要的是在聚合时由于数值型匹 配,JOIN效率高,便于聚合,而且代理键对缓慢变化维度有更重要的意义...事 实数据表是数据仓库的核心,需要精心维护,在JOIN后将得到事实数据表,一般记录条数都比较大,我们需要为其设置复合主键和索引,以为了数据的完整性和 基于数据仓库的查询性能优化,事实数据表与维度表一起放于数据仓库中...所以SQL更适合在固定数据库中执行大范围的查询和数据更改,由于脚本语言可以随便编写,所以在固定数据库中能够实现的功能就相当强大,不像ETL中功能只能受组件限制,组件有什么功能,才能实现什么功能。...技术缓冲到近源模型层的数据流算法-----常规拉链算法: 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据...近源模型层到整合模型层的数据流算法----常规拉链算法: 此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据
25分钟突然飙升到3小时以上,且最终以失败告终。...排查步骤第一步:基础排查首先检查了当日数据量是否异常增长:SELECT COUNT(*) FROM user_behavior_log WHERE dt='20230501';结果显示数据量在正常范围内...根本原因经过分析,问题根源在于:上游数据采集系统在当日升级时出现了bug,导致大量用户行为的join_key字段被误置为NULLHive在JOIN操作时,所有NULL值都会被当作相同的键处理,从而被分配到同一个...:需要建立数据质量监控体系,对NULL值比例、数据分布等关键指标进行定期检查理解Hive特性:Hive在处理JOIN、GROUP BY等操作时,NULL值会被视为相同的键,这个特性在数据倾斜时需要特别注意优化参数配置...一个好的数据开发工程师不仅要会写SQL,更要具备全链路的数据思维和问题排查能力。
查询2019年1月1日至今,每天的注册用户数,下单用户数,以及注册当天即下单的用户数(请尽量在一个sql语句中实现)。...比如用户「小包总」在6月10日注册了网站,在6月20日下了第一笔订单,以user_id字段连接两表,一个user_id对应两个时间,以注册时间为分组依据,得不到准确的当日下单用户数,以下单时间为分组依据...,得不到准确的当日注册用户数; 4.不能用user_id做连接字段,需要用用户表的注册时间和订单表的下单时间作为连接字段。...题目要求查询2019年1月1日至今的数据情况,把这个条件加在where后面: select * from( select reg_tm from table_user union select order_tm...需要注意的是,在将临时表table_date与table_user左连时,对应关系是一对多,生成的结果是一个多表,再与table_order左连,对应关系是多对多,多对多的情况下,数据一定是有重复的,所以需要去重处理
预计阅读时间:8min 解决痛点:本文为招聘过程中总结的7道SQL面试题,涵盖常考知识点,对于准备找工作的你会有很大帮助。...【用户表】ubs_user_profile_di 当日活跃用户,ds+uid为唯一key,每个用户每日仅有一条数据。...表结构如下: 【购物消费流水表】ubs_sales_di 当日用户消费详细数据,每一条代表用户购买一次商品,用户每日可购买多次商品。...ds between date_add('20220501', -90) and '20220501' and is_new = 1 )tmp1 inner join...08 注意事项 最后和大家谈谈针对面试中遇到的SQL问题的关注点: 由于是面试,面试官重点关注的是思路,因此在忘记某些函数的情况下,可以将思路输出给面试官,函数是工具,可以随时查询,而思路才是你掌握这个知识的关键
概述 MySQL 中当需要使用其它表的数据来更新数据时,多表联合查询的数据进行更新,可通过 update select 语句将select查询结果执行update。...`field2` WHERE [条件]; 示例 例如:有一个订单表 orders 和一个汇率表 rates ,根据订单表的货币类型 currency 及日期字段 created_at 查询货币当日汇率...rate date 1 USD 7.12 2023-06-10 2 EUR 7.66 2023-06-10 3 USD 7.14 2023-06-12 4 EUR 7.67 2023-06-12 执行SQL...UPDATE `orders` o INNER JOIN `rates` r ON r....,也可以是 LEFT JOIN 、 RIGHT JOIN 等联合查询
窗口函数 群组分析方法对应到SQL里常用窗口函数来实现。也就是从某些维度对数据分组(partition by),然后同样也可以对每个组进行统计运算。...首先要获取“当日首次购买用户量”,也就是获取每个用户的第一次购买的日期(也就是对用户按购买时间排名,排名第1的就是第一次购买的日期)。...: “购买顺序”为1时,即该用户首次购买的日期。...select t1.日期, count(distinct t1.用户id) as 当日首次购买用户量, count(distinct t2.用户id) as 次月复购用户量,...里用窗口函数实现 3.SQL常用函数的使用,包括:count、date、timestampdiff、distinct。