力扣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)-用户购买平台(困难)的主要内容,如果未能解决你的问题,请参考以下文章

图论刷题-4力扣 778. 水位上升的泳池中游泳

尝试在 mysql 中添加 udf 会出现错误 ERROR 1127 (HY000): Can't find symbol in library

力扣 每日一题 927. 三等分难度:困难

力扣 每日一题 1250. 检查「好数组」难度:困难,rating: 1983(数论)

力扣 每日一题 1235. 规划兼职工作难度:困难,rating: 2022(动态规划+二分查找)

力扣 每日一题 768. 最多能完成排序的块 II难度:困难,rating: 1787(区间合并+区间计数)