本文已参与「新人创作礼」活动,一起开启掘金创作之路。
33.看到相同取最小就想到dense_rank()
select student_id, course_id, grade
from (
select
*,dense_rank() over(partition by student_id order by grade desc,course_id) as rk
from enrollments)t where rk=1
select
student_id,
min(course_id) as course_id,
grade
from
enrollments
where(student_id,grade) in
(
select
student_id,
max(grade) over(partition by student_id) mxg
from enrollments)
group by student_id
order by student_id #或者使用group by也可以做到取最小值
34.为什么不同的地方做法是不一样的???
select
user_id,
min(activity_date) as md
from traffic
where activity='login'
group by user_id having count(activity_date)>0 #这样就有输出
# datediff('2019-06-30',activity_date)<=90 #这样没有输出,报错不知道activity_date是什么
难道是因为聚合函数会去找原来的那个表,但是使用非聚合函数就不会去找了?
35.left join on 和where的差别
很细节,建议看看
有两个表,一个是订单表,一个是书目表。我要获得最近一年中没有卖出超过10本的书(最近一个月刚上架的不算)
1.首先,我要用订单表去left join书表,
不是inner join2.如果是inner join就会导致一个情况,就是如果有的书没有卖出去过,
交了之后的表中我们也看不见了,3.同理,如果用on,我们交了之后还可以得到null,但是如果是where,会把所有的null行删除,4.后面我们会对数字进行统计,如果有行,至少还可以知道书名是什么,但是如果这行都没有,那么对应的数据表我们也看不见了。
select
b.book_id,
b.name
from books b left join orders o
on b.book_id=o.book_id
and datediff('2019-06-23',dispatch_date)<=365
where datediff('2019-06-23',available_from)>=30
group by b.book_id having ifnull(sum(quantity),0)<10
#最后记得做一个ifnull,
如果没有这个,统计出来答案为null,null<10是错的,`一本都没有卖出的书就不会显示了`