SQL题目类型总结。

1.排序。

        此处说的排序主要指使用窗口函数中的排序,分别为dense_rank() over(partition by ... order by ...),rank() over(partition by ... order by ...), row_number() over(partition by ... order by ...),并非order by。        

        那什么时候会用到排序呢?有的题目本身就是为了得到排序结果,这样就比较简单,例如1.部门工资前三高的所有员工

dense_rank() over(partition by DepartmentId order by salary desc)

8.获取最近第二次的活动

row_number() over(partition by username order by startDate desc)

14.市场分析 II

row_number() over(partition by seller_id order by order_date)

15.锦标赛优胜者

row_number() over(partition by p.group_id order by (sum(if(p.player_id=m.first_player, m.first_score, m.second_score)) desc;

        而有些题目则可以通过排序,找出中间态进而得到答案,包括

3.员工薪水中位数

row_number() over(partition by company order by salary)

11.学生地理信息报告

row_number() over (partition by continent order by name)

19.同一天的第一个电话和最后一个电话

dense_rank() over (PARTITION BY caller_id, DATE_FORMAT(call_time, '%Y-%m-%d') order by call_time ASC)
dense_rank() over (PARTITION BY caller_id, DATE_FORMAT(call_time, '%Y-%m-%d') order by call_time DESC)

        总体来说,使用窗口函数排序,可复杂问题简单化。


2.创建聚合键

        当题目中并没有明确的聚合键而又不得不用才能进展下去时,就要再自己创建了。便可以使用窗口函数中的排序来完成,其实和上边的类型是一样的,只不过这种方法很巧妙故单独来出来。包括

5.体育馆的人流量()

id-row_number() over(order by id)

7.报告系统状态的连续日期

t2.rn-row_number() over(partition by t2.flag order by t2.dt)

3.日期类型变化

        当原数据日期类型并不能直接使用时,那就要更改类型了。其中第一个函数可以使用date_format()函数用于以不用的格式显示日期时间等,包括

6.平均工资:部门与公司比较

date_format(s.pay_date, "%Y-%m")

19.同一天的第一个电话和最后一个电话

date_format(call_time, '%Y-%m-%d')

        第二个函数可以使用weekday,获取的是指定日期的星期

10.周内每天的销售情况

weekday(o.order_date) 

4.(not) in和(not) exists

        in:在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。包括

5.体育馆的人流量

where r in (...)

        exists:指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。相对外表比较小的时候,exist是的速度较快。

        not in:查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引9.查找成绩处于中游的学生​​​​​​

where e.student_id not in (...)

        not exist:not extsts 的子查询依然能用到表上的索引。

16.页面推荐Ⅱ

where e.student_id not in (...)

19.Leetcodify 好友推荐

and not exists (...)

        也就是说,in和exists需要具体情况具体分析,not in和not exists就不用分析了,尽量用not exists就好了。


5.联结方式

        说的联结方式并不是说某种确定联结方式,想表达的是比如说两张表联结时,on中不只是table1.id = table2.id这么简单,还可以

2.行程和用户

on t.client_id = u1.users_id and u1.banned = "No"

4.查询员工的累计薪水

on (t.id = e1.id and t.maxmonth > e1.month)

12.游戏玩法分析 V

ON (a.player_id = b.player_id AND DATEDIFF(b.event_date , a.first_date) = 1)

15.锦标赛优胜者

on (m.first_player = p.player_id or m.second_player = p.player_id)

17.Leetcodify 好友推荐

on a.user_id <> b.user_id

19.同一天的第一个电话和最后一个电话

ON (a.caller_id = b.caller_id AND a.recipient_id = b.recipient_id AND a.rk = 1 AND b.rk = 1)

        其实就可以理解为精确的联结,这样才不会多或少行。


6.笛卡尔集(cross join)

        相比于inner join、left join、right join, cross join用的少甚至还要避免这种操作,但是在有些时候没有笛卡尔集的情况下就没办法全部显示,比如

13.用户购买平台

a cross join b

        所以说学知识点的时候要灵活,学会发散。

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值