LeetCode:Database 54.用户购买平台

Posted Xiao Miao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:Database 54.用户购买平台相关的知识,希望对你有一定的参考价值。

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

支出表: Spending的结构

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| spend_date  | date    |
| platform    | enum    | 
| amount      | int     |
+-------------+---------+
这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序。
这张表的主键是 (user_id, spend_date, platform)。
平台列 platform 是一种 ENUM ,类型为('desktop', 'mobile')。

Spending 表:

+---------+------------+----------+--------+
| 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:

+------------+----------+--------------+-------------+
| 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 仅 使用了桌面端购买,且没有用户 同时 使用桌面端和手机端购买。

SQL语句:

WITH c AS( 
SELECT DISTINCT spend_date,'desktop' AS  platform FROM spending
UNION ALL
SELECT DISTINCT spend_date,'mobile' AS  platform FROM spending
UNION ALL
SELECT DISTINCT spend_date,'both' AS  platform FROM spending 
)

SELECT c.spend_date,c.platform,SUM(IF(b.amount IS NULL,0,b.amount)) AS total_amount,
COUNT(DISTINCT b.user_id)AS total_users  FROM (
SELECT spend_date,CASE WHEN r=1 THEN platform ELSE 'both' END AS platform,
amount,user_id
FROM(
SELECT user_id,spend_date,platform,amount,
COUNT(*) over(PARTITION BY user_id,spend_date) AS r
FROM spending
)a)b
RIGHT JOIN c
ON c.spend_date=b.spend_date AND c. platform=b.platform
GROUP BY b.spend_date,b.platform;

以上是关于LeetCode:Database 54.用户购买平台的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode:Database 46.销售分析 II

LeetCode:Database 37.买下所有产品的客户

LeetCode:Database 100.活跃用户

LeetCode:Database 100.活跃用户

LeetCode:Database 05.行程和用户

LeetCode:Database 50.每日新用户统计