为了刷力扣特意充了年费会员,400元真是太贵了呜呜呜

刷题单:

递归 递归

刷题过程中发现leetcode好像不能通过create生成表,只能用with as生成临时表,sad= 。 =

今天学习到了一个新方法!!

使用WITH RECURSIVE递归生成连续变量临时表

如果有需求是需要补全数据的话,也就是在原数据表中不存在但是仍需在结果表中呈现该字段的时候,可以自己制作一个连续的临时表用来补全不连续的字段

1
2
3
4
5
WITH RECURSIVE d AS (
select 0 as n,1 as fact
UNION ALL
SELECT n+1, (n+1)*fact FROM d WHERE n < 7
)

10-23进度&总结

目前完成了11道题,进展有点缓慢= 。 =

总结了一下在调试中出现错误的原因:

  1. 总是忘记维度,比如经常做着做着就忘记了这个度量值应该在哪个维度下统计或是join的时候要思考好久on后的条件(归根结底,脑子太笨了)
  2. 去重与不去重的情况一定要想清楚
  3. 一些结果为null的值没有及时做处理
  4. 自连接后一定要先排除自己和自己相连的行信息

今天的全场最佳题目:2004. The Number of Seniors and Juniors to Join the Company

个人认为是比较新颖的~

总结一些小技巧:

  1. 递归生成连续变量的临时表
  2. 笛卡尔积生成一个全信息表,作为左表用来实现补全数据的功能
  3. 针对固定范围内统计(比如三天内,三个月内等等)生成辅助列,通过join between合并后进行聚合计算;如果需要统计一共连续了多久可以用row_number打行号的方式来做
  4. 可以通过if(first_value(if(xxx=a,1,0)) over(…)=1,..,..)在原表中打标记来实现在规定范围内只要出现1个a,那么该范围内所有都打上标记/接收/排除的情况
  5. 排除某种情况除了可以where xx not in(select …)方法之外,还可以left join两张表(待排除/接收的为右表),筛选条件为右表同字段is null/is not null,其实接收情况直接用inner join就可以

10-24进度&总结

全场最佳:571. 给定数字的频率查询中位数

一开始只要找总数+1/2距离各项累计数最近的即可,后来发现没有这么简单= 。 =

最麻烦:1384. 按年度列出销售总额

这道题的判断逻辑花了好久才弄明白(脑子短路ing)

错误的原因:

  1. over(partition by a order by b) 默认rows范围是在分区a按b排序下的unbounded preceding 到 current row

    over(partition by a) 默认rows范围是在分区a下的unbounded preceding 到 unbounded following

    over(order by a) 默认rows范围是在b排序下的unbounded preceding 到 current row

    这导致下列两个语句:

    last_value() over(order by xx)

    first_value() over(order by xx desc)

    的结果是不一样的,first_value中unbounded preceding 到 current row可以保证选到第一行,但是last_value不能保证选到最后一行,下界是到当前行

  2. union默认是union distinct

10-25进度&总结

全场最佳:618. 学生地理信息报告

一直在思考怎么把所有值顶上去忽略null值,最后看了评论区大佬的答案恍然大悟,解决方法是根据排序打上行号,根据行号来group,在各大洲同个排序号下的就可以放到一行

掌握recursive财富密码的题目:1767. 寻找没有被执行的任务对

递归的层级结构类似这样:

递归