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