sql(day1)
这个题目的子查询创建了一个列表,学习一个新语法
ROW_NUMBER() OVER (
[PARTITION BY expr1, expr2,...]
ORDER BY expr1 [ASC | DESC], expr2,...
)
在此语法中,
- PARTITION BY 子句将结果集划分为分区。PARTITION BY 子句是可选的。如果省略它,ROW_NUMBER 函数会将整个结果集视为单个分区。
- ORDER BY 子句对每个分区中的行进行排序。由于 ROW_NUMBER() 是一个对顺序敏感的函数,因此 ORDER BY 子句是强制性的。
- ROW_NUMBER() 函数为每个分区内的每一行分配一个连续的整数序号。当跨越分区边界时,它会重置行号。
还有就是, COUNT(*), SUM(), AVG()等聚合函数要在SELECT后面写。
最长连续登陆天数
这个题目造了3个表(CTE和子查询),虽然没有特别理解这个思路的来源吧,但是先顺着答案过了一遍,CTE的写法要在前面加个
WITH,例如WITH ordered_logins AS(……),注意多个CTE只写一个WITH就行,但是中间要加逗号。
求一列中非NULL的占比:CONCAT(ROUND(SUM(CASE WHEN l.overdue_days IS NOT NULL THEN 1 ELSE 0 END)/COUNT(*)*100,1),'%')
记录一下CASE WHEN的用法:
CASE WHEN condition THEN result
[WHEN...THEN...]
ELSE result
END
ROUND的用法:round(number,digits)
CONCAT的用法:CONCAT(string1, string2, ...)
获取指定客户每月的消费额
这个题目需要记录的有:
- DATE_FORMAT:用于以不同的格式显示日期/时间数据,DATE_FORMAT(date,format),例如:DATE_FORMAT(t.t_time,'%Y-%m')
- GROUP BY和ORDER BY可以使用别名,即可以使用在SELECT中使用函数等重新命名的列名。
查看7道真题和解析