Leetcode SQL精选题(七)

65 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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的差别

leetcode.cn/problems/un…

很细节,建议看看

有两个表,一个是订单表,一个是书目表。我要获得最近一年中没有卖出超过10本的书(最近一个月刚上架的不算)

1.首先,我要用订单表去left join书表,不是inner join

2.如果是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,
如果没有这个,统计出来答案为nullnull<10是错的,`一本都没有卖出的书就不会显示了`