前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode面试SQL-用户购买平台

LeetCode面试SQL-用户购买平台

作者头像
数据仓库晨曦
发布于 2024-09-24 10:46:03
发布于 2024-09-24 10:46:03
25400
代码可运行
举报
文章被收录于专栏:数据仓库技术数据仓库技术
运行总次数:0
代码可运行

一、题目

支出表: t2_spending

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| spend_date  | string  |
| platform    | string  | 
| amount      | int     |
+-------------+---------+
  • 这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序。
  • 这张表的主键是 (user_id, spend_date, platform)。

写一段 SQL 来查找每天 使用手机端用户、 使用桌面端用户和 同时 使用桌面端和手机端的用户人数和总支出金额。

查询结果格式如下例所示: t2_spending table:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------+------------+----------+--------+
| user_id | spend_date | platform | amount |
+---------+------------+----------+--------+
| 1       | 2019-07-01 | mobile   | 100    |
| 1       | 2019-07-01 | desktop  | 100    |
| 2       | 2019-07-01 | mobile   | 100    |
| 2       | 2019-07-02 | mobile   | 100    |
| 3       | 2019-07-01 | desktop  | 100    |
| 3       | 2019-07-02 | desktop  | 100    |
+---------+------------+----------+--------+

Result table:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+------------+----------+--------------+-------------+
| spend_date | platform | total_amount | total_users |
+------------+----------+--------------+-------------+
| 2019-07-01 | desktop  | 100          | 1           |
| 2019-07-01 | mobile   | 100          | 1           |
| 2019-07-01 | both     | 200          | 1           |
| 2019-07-02 | desktop  | 100          | 1           |
| 2019-07-02 | mobile   | 100          | 1           |
| 2019-07-02 | both     | 0            | 0           |
+------------+----------+--------------+-------------+ 

在 2019-07-01, 用户1 同时 使用桌面端和手机端购买, 用户2 仅 使用了手机端购买,而用户3 仅 使用了桌面端购买。 在 2019-07-02, 用户2 仅 使用了手机端购买, 用户3 仅 使用了桌面端购买,且没有用户 同时 使用桌面端和手机端购买。

二、分析

本题难点在于:1。对于仅使用一个平台的列出其平台,而对于使用两个平台的需要标记为both;2.对于07-02没有both的,需要进行显示为0的处理。

维度

评分

题目难度

⭐️⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐️

业务常见度

⭐️⭐️⭐️

三、SQL

1.区分desktop、mobile、both

由于spark不支持count(distinct )开窗,所以我们先计算一下每个用户每天使用的平台个数。 然后原表与新表关联,计算出每个用户每天使用的new_platform平台类型。

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select t1.spend_date,
       t1.user_id,
       t1.platform,
       t1.amount,
       t2.plat_cnt,
       if(t2.plat_cnt = 1, t1.platform, 'both') as new_platform
from t2_spending t1
         left join
     (select spend_date,
             user_id,
             count(distinct platform) as plat_cnt
      from t2_spending
      group by spend_date,
               user_id) t2
     on t1.spend_date = t2.spend_date
         and t1.user_id = t2.user_id

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+----------+-----------+---------+-----------+---------------+
| spend_date  | user_id  | platform  | amount  | plat_cnt  | new_platform  |
+-------------+----------+-----------+---------+-----------+---------------+
| 2019-01-01  | 1        | mobile    | 100     | 2         | both          |
| 2019-01-01  | 1        | desktop   | 100     | 2         | both          |
| 2019-01-01  | 2        | mobile    | 100     | 1         | mobile        |
| 2019-01-02  | 2        | mobile    | 100     | 1         | mobile        |
| 2019-01-01  | 3        | desktop   | 100     | 1         | desktop       |
| 2019-01-02  | 3        | desktop   | 100     | 1         | desktop       |
+-------------+----------+-----------+---------+-----------+---------------+

2.使用new_plateform 计算各项指标

我们使用新的new_platform来计算各项结果

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select spend_date,
       new_platform,
       sum(amount)             as total_amount,
       count(distinct user_id) as total_users
from (select t1.spend_date,
             t1.user_id,
             t1.platform,
             t1.amount,
             t2.plat_cnt,
             if(t2.plat_cnt = 1, t1.platform, 'both') as new_platform
      from t2_spending t1
               left join
           (select spend_date,
                   user_id,
                   count(distinct platform) as plat_cnt
            from t2_spending
            group by spend_date,
                     user_id) t2
           on t1.spend_date = t2.spend_date
               and t1.user_id = t2.user_id) tt
group by spend_date,
         new_platform
order by 1 asc

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+---------------+---------------+--------------+
| spend_date  | new_platform  | total_amount  | total_users  |
+-------------+---------------+---------------+--------------+
| 2019-01-01  | mobile        | 100           | 1            |
| 2019-01-01  | desktop       | 100           | 1            |
| 2019-01-01  | both          | 200           | 1            |
| 2019-01-02  | desktop       | 100           | 1            |
| 2019-01-02  | mobile        | 100           | 1            |
+-------------+---------------+---------------+--------------+

3.补充维表得到最终结果

需要每天展示不同平台的全部数据,所以我们先创建一张包含mobile,desktop,both类型与全量日期组合的数据表

执行SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ttt1.spend_date,
       ttt1.platform,
       coalesce(total_amount, 0) as total_amount,
       coalesce(total_users, 0)  as total_users
from (
--生成日期+平台类型的全量的数据
         select spend_date, 'desktop' as platform
         from t2_spending
         group by spend_date
         union all
         select spend_date, 'mobile' as platform
         from t2_spending
         group by spend_date
         union all
         select spend_date, 'both' as platform
         from t2_spending
         group by spend_date) ttt1
         left join
     (select spend_date,
             new_platform,
             sum(amount)             as total_amount,
             count(distinct user_id) as total_users
      from (select t1.spend_date,
                   t1.user_id,
                   t1.platform,
                   t1.amount,
                   t2.plat_cnt,
                   if(t2.plat_cnt = 1, t1.platform, 'both') as new_platform
            from t2_spending t1
                     left join
                 (select spend_date,
                         user_id,
                         count(distinct platform) as plat_cnt
                  from t2_spending
                  group by spend_date,
                           user_id) t2
                 on t1.spend_date = t2.spend_date
                     and t1.user_id = t2.user_id) tt
      group by spend_date,
               new_platform) ttt2
     on ttt1.platform = ttt2.new_platform
         and ttt1.spend_date = ttt2.spend_date
order by 1 asc

SQL结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------------+-----------+---------------+--------------+
| spend_date  | platform  | total_amount  | total_users  |
+-------------+-----------+---------------+--------------+
| 2019-01-01  | desktop   | 100           | 1            |
| 2019-01-01  | mobile    | 100           | 1            |
| 2019-01-01  | both      | 200           | 1            |
| 2019-01-02  | desktop   | 100           | 1            |
| 2019-01-02  | mobile    | 100           | 1            |
| 2019-01-02  | both      | 0             | 0            |
+-------------+-----------+---------------+--------------+

四、建表语句和数据插入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--建表语句
CREATE TABLE t2_spending(
user_id int,
spend_date string,
platform string,
amount int
) COMMENT '支出表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
;
-- 插入数据
insert into t2_spending(user_id,spend_date,platform,amount)
values
(1,'2019-01-01','mobile',100),
(1,'2019-01-01','desktop',100),
(2,'2019-01-01','mobile',100),
(2,'2019-01-02','mobile',100),
(3,'2019-01-01','desktop',100),
(3,'2019-01-02','desktop',100);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode MySQL 1127. 用户购买平台 *
写一段 SQL 来查找每天 仅 使用手机端用户、仅 使用桌面端用户、 同时 使用桌面端和手机端的用户人数和总支出金额。
Michael阿明
2021/02/19
2.3K0
「SQL面试题库」 No_65 用户购买平台
写一段 SQL 来查找每天 仅 使用手机端用户、仅 使用桌面端用户和 同时 使用桌面端和手机端的用户人数和总支出金额。
不吃西红柿
2023/05/23
1.2K0
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 15丨用户购买平台【难度困难】
写一段 SQL 来查找每天 仅 使用手机端用户、仅 使用桌面端用户和 同时 使用桌面端和手机端的用户人数和总支出金额。
不吃西红柿
2022/07/29
1.5K0
LeetCode数据库题目集合
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
MiChong
2021/02/24
9780
LeetCode数据库题目集合
分享几道LeetCode中的MySQL题目解法
最近刷完了LeetCode中的所有数据库题目,深深感到有些题目还是非常有深度和代表性的,而且比较贴合实际应用场景,特此发文以作分享。
luanhz
2020/05/04
2.1K0
LeetCode 数据库专题
写一段SQL查询来展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。你可以以 任意 顺序返回结果表。查询结果的格式如下例所示:
wywwzjj
2023/05/09
1.5K0
LeetCode 数据库专题
LeetCode MySQL 1132. 报告的记录 II
编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位。
Michael阿明
2021/02/19
3690
「SQL面试题库」 No_63 报告的记录 II
编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位。
不吃西红柿
2023/05/23
2100
常见大数据面试SQL-查询每个产品每年总销售额
已知有表如下,记录了每个产品id、产品名称、产品销售开始日期、产品销售结束日期以及产品日均销售金额,请计算出每个产品每年的销售金额
数据仓库晨曦
2024/06/28
2070
常见大数据面试SQL-查询每个产品每年总销售额
经典的SparkSQL/Hive-SQL/MySQL面试-练习题
32.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
大数据学习与分享
2020/10/23
1.3K0
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
你以为 SQL 只是简单的 SELECT * FROM table?那你可就大错特错了! 在这个数据驱动的时代,真正的高手早已抛弃低效的查询方式,玩转窗口函数、递归 CTE、动态透视表,甚至用近似计算让百亿级数据秒出结果! 还在为 SQL 运行慢、分析难、报表卡死而苦恼? 别担心,这篇文章带你深入 SQL 世界,从业务思维出发,手把手拆解 用户增长、行为分析、订单转化、留存率 等核心场景,让你的数据分析能力直接起飞!
睡前大数据
2025/03/25
1180
SQL 进阶指南:掌握这些高阶技巧,让你的数据分析快人一步!
腾讯大数据面试SQL-占据好友封面个数
有两个表,朋友关系表user_friend,用户步数表user_steps。朋友关系表包含两个字段,用户id,用户好友的id;用户步数表包含两个字段,用户id,用户的步数
数据仓库晨曦
2024/06/17
1500
腾讯大数据面试SQL-占据好友封面个数
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
在数据类岗位招聘过程中,经常会考察求职者的SQL能力,这里整理了3个常考的SQL数据分析题,按照由简单到复杂排序,一起来测试一下你掌握了么?
博文视点Broadview
2022/01/21
7880
数据分析人员需要掌握SQL到什么程度?3个常考题目刷一刷
「SQL面试题库」 No_102 按年度列出销售总额
题目介绍: 按年度列出销售总额 total-sales-amount-by-year
不吃西红柿
2023/10/16
2510
「SQL面试题库」 No_95 每次访问的交易次数
题目介绍: 每次访问的交易次数 number-of-transactions-per-visit
不吃西红柿
2023/10/16
1960
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 16丨报告的记录 II【难度中等】
编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位。
不吃西红柿
2022/07/29
1620
LeetCode MySQL 1113. 报告的记录
此表没有主键,所以可能会有重复的行。 action 字段是 ENUM 类型的,包含:('view', 'like', 'reaction', 'comment', 'report', 'share') extra 字段是可选的信息(可能为 null), 其中的信息例如有:1.报告理由(a reason for report) 2.反应类型(a type of reaction)
Michael阿明
2021/02/19
9520
MySql场景面试题:电商业务中高净值用户行为分析
电商业务,一个订单表 orders 和一个用户表 users。你需要分析用户的购买行为,特别是那些在特定时间段内购买金额超过一定阈值的用户,并计算他们的平均购买金额、购买次数以及他们在总用户中的占比。
公众号:码到三十五
2025/01/22
1470
(八)HQL手写题(1)
表结构:uid,subject_id,score 求:找出所有科目成绩都大于某一学科平均成绩的学生 数据集如下 1001 01 90 1001 02 90 1001 03 90 1002 01 85 1002 02 85 1002 03 70 1003 01 70 1003 02 70 1003 03 85 1)建表语句 create table score( uid string, subject_id string, score int) row format delimited fields terminated by '\t'; 2)求出每个学科平均成绩 select uid, score, avg(score) over(partition by subject_id) avg_score from score;t1 3)根据是否大于平均成绩记录flag,大于则记为0否则记为1 select uid, if(score>avg_score,0,1) flag from t1;t2 4)根据学生id进行分组统计flag的和,和为0则是所有学科都大于平均成绩 select uid from t2 group by uid having sum(flag)=0; 5)最终SQL select uid from (select uid, if(score>avg_score,0,1) flag from (select uid, score, avg(score) over(partition by subject_id) avg_score from score)t1)t2 group by uid having sum(flag)=0;
wolf
2020/09/21
6200
「SQL面试题库」 No_92 餐馆营业额变化增长
写一条 SQL 查询计算以 7 天(某日期 + 该日期前的 6 天)为一个时间段的顾客消费平均值
不吃西红柿
2023/10/16
1250
推荐阅读
相关推荐
LeetCode MySQL 1127. 用户购买平台 *
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档