You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
使用 case 语句,计算出 platform ,如果一个用户在一天当中同时使用了 mobile 和 desktop ,则 platform 的值是 both
如果一个用户的 platform = 'both',这个用户的当天总支出是 mobile 和 desktop 的 支出相加
一个用户一天只能是一个平台,所以要去重 count(distinct user_id) users
select
user_id,
spend_date,
any_value(
case when count(platform) =2 then 'both' else platform end
) as platform,
sum(amount) amount,
count(distinct user_id) users
from spending group by user_id, spend_date
题目
题目链接:用户购买平台
写一段 SQL,查找每天仅使用手机端用户、仅使用桌面端用户和同时使用桌面端和手机端的用户人数和总支出金额。
输出:
spend_date | platform | total_amount | total_users
SQL:方法一
分析
分两步,分别构建一张临时,然后两张表进行联结
spend_date
和平台platform
user_id
、spend_date
、platform
、amount
、users
mobile
或者desktop
,也可以同时使用。spend_date
和platform
进行联结解析
按照日期和平台构建临时表
t1
,作用是每天都有三个平台:mobile
、desktop
、both
union
关键字联结三次子查询基于
spending
表,按照user_id
、spend_date
进行分组查询,作为临时表t2
case
语句,计算出platform
,如果一个用户在一天当中同时使用了mobile
和desktop
,则platform
的值是both
platform = 'both'
,这个用户的当天总支出是mobile
和desktop
的 支出相加count(distinct user_id) users
临时表
t1
联结临时表t2
,联结条件是spend_date
和platform
查询联结后的表,计算出每天每个平台的总人数和总金额,按照
t1.spend_date
和t1.platform
进行分组coalesce(expr, expr, ...)
,返回第一个非空值SQL:方法二
解析
和方法一思路一样,区别是方法二用的是内连接。
构建
t1
表只需要一个platform
,它的作用是spending
表中没有both
字段,所以这里是固定输出三个值mobile
、desktop
、both
构建
t2
表的方法和方法一一样对
t1
和t2
使用自联结,没有条件的自联结是一个笛卡尔积最终结果是每个平台每天的
总用户数
和支出总金额
,所以使用日期和平台作为分组The text was updated successfully, but these errors were encountered: