力扣1127(MySQL)-用户购买平台(困难)
Posted 我不想一直当菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣1127(MySQL)-用户购买平台(困难)相关的知识,希望对你有一定的参考价值。
题目:
支出表: Spending
这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端(‘desktop’)和手机端(‘mobile’)的应用程序。
这张表的主键是 (user_id, spend_date, platform)。
平台列 platform 是一种 ENUM ,类型为(‘desktop’, ‘mobile’)。
问题
写一段 SQL 来查找每天 仅 使用手机端用户、仅 使用桌面端用户和 同时 使用桌面端和手机端的用户人数和总支出金额。
查询结果格式如下例所示:
Spending table:
Result table:
在 2019-07-01, 用户1 同时 使用桌面端和手机端购买, 用户2 仅 使用了手机端购买,而用户3 仅 使用了桌面端购买。
在 2019-07-02, 用户2 仅 使用了手机端购买, 用户3 仅 使用了桌面端购买,且没有用户 同时 使用桌面端和手机端购买。
建表语句:
drop table if EXISTS spending_1127; create table if not exists spending_1127( user_id int, spend_date date, platform enum(\'desktop\',\'mobile\'), amount int ); truncate table spending_1127; insert into spending_1127 values(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\');
解题思路:
这道题对于我来说有点困难,参考了一下其他博主的题解
①先查询出每个用户id的platform情况以及交易总额;
select user_id, spend_date,if(count(distinct platform) = 2, \'both\', platform) as platform,sum(amount) as total_amount from spending_1127 group by user_id, spend_date;
②再创建一个临时表,列出platform的情况;
select \'desktop\' as platform union select \'mobile\' as platform union select \'both\' as platform
③再使上面两步查询出的临时表内连接,以spend_date,platform分组,使用case when进行数量统计;
select spend_date,b.platform, sum(case when a.platform = b.platform then total_amount else 0 end) as total_amount, count(if(a.platform = b.platform, 1, null)) as total_users from ( select user_id, spend_date,if(count(distinct platform) = 2, \'both\', platform) as platform,sum(amount) as total_amount from spending_1127 group by user_id, spend_date ) as a, ( select \'desktop\' as platform union select \'mobile\' as platform union select \'both\' as platform )as b group by spend_date,platform order by spend_date
小知识:
内连接分为显示的内连接和隐式的内连接,内连接的结果是笛卡尔积
显示的内连接:有inner join关键字,有on关键字表示的条件;
隐式的内连接:用逗号分隔两个数据库表,条件的表示只能用where。
LeetCode(数据库)- 用户购买平台
题目链接:点击打开链接
题目大意:略。
解题思路:此题难点在于都为 ‘both’ 的时候,怎么去筛选这个 ‘both’ 很容易错误思维会把 ‘both’ 为空的情况忽略掉。
AC 代码
select
spend_date, platform,
ifnull(sum(total_am),0) total_amount,
ifnull(sum(total_u),0) total_users
from
(
select p.spend_date, p.platform, t.total_am, t.total_u
from
(
select distinct spend_date, "desktop" platform from Spending
union
select distinct spend_date, "mobile" platform from Spending
union
select distinct spend_date, "both" platform from Spending
) p
left join
(
select spend_date,
if(count(distinct platform)=1, platform, 'both') plat,
sum(amount) total_am,
count(distinct user_id) total_u
from Spending
group by spend_date, user_id
) t
on p.platform = t.plat and p.spend_date = t.spend_date
) temp
group by spend_date, platform
以上是关于力扣1127(MySQL)-用户购买平台(困难)的主要内容,如果未能解决你的问题,请参考以下文章
尝试在 mysql 中添加 udf 会出现错误 ERROR 1127 (HY000): Can't find symbol in library
力扣 每日一题 1250. 检查「好数组」难度:困难,rating: 1983(数论)