为了刷力扣特意充了年费会员,400元真是太贵了呜呜呜
刷题单:
刷题过程中发现leetcode好像不能通过create生成表,只能用with as生成临时表,sad= 。 =
今天学习到了一个新方法!!
使用WITH RECURSIVE递归生成连续变量临时表
如果有需求是需要补全数据的话,也就是在原数据表中不存在但是仍需在结果表中呈现该字段的时候,可以自己制作一个连续的临时表用来补全不连续的字段
1 | WITH RECURSIVE d AS ( |
10-23进度&总结
目前完成了11道题,进展有点缓慢= 。 =
总结了一下在调试中出现错误的原因:
- 总是忘记维度,比如经常做着做着就忘记了这个度量值应该在哪个维度下统计或是join的时候要思考好久on后的条件(归根结底,脑子太笨了)
- 去重与不去重的情况一定要想清楚
- 一些结果为null的值没有及时做处理
- 自连接后一定要先排除自己和自己相连的行信息
今天的全场最佳题目:2004. The Number of Seniors and Juniors to Join the Company
个人认为是比较新颖的~
总结一些小技巧:
- 递归生成连续变量的临时表
- 笛卡尔积生成一个全信息表,作为左表用来实现补全数据的功能
- 针对固定范围内统计(比如三天内,三个月内等等)生成辅助列,通过join between合并后进行聚合计算;如果需要统计一共连续了多久可以用row_number打行号的方式来做
- 可以通过if(first_value(if(xxx=a,1,0)) over(…)=1,..,..)在原表中打标记来实现在规定范围内只要出现1个a,那么该范围内所有都打上标记/接收/排除的情况
- 排除某种情况除了可以where xx not in(select …)方法之外,还可以left join两张表(待排除/接收的为右表),筛选条件为右表同字段is null/is not null,其实接收情况直接用inner join就可以
10-24进度&总结
全场最佳:571. 给定数字的频率查询中位数
一开始只要找总数+1/2距离各项累计数最近的即可,后来发现没有这么简单= 。 =
最麻烦:1384. 按年度列出销售总额
这道题的判断逻辑花了好久才弄明白(脑子短路ing)
错误的原因:
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不能保证选到最后一行,下界是到当前行
union默认是union distinct
10-25进度&总结
全场最佳:618. 学生地理信息报告
一直在思考怎么把所有值顶上去忽略null值,最后看了评论区大佬的答案恍然大悟,解决方法是根据排序打上行号,根据行号来group,在各大洲同个排序号下的就可以放到一行
掌握recursive财富密码的题目:1767. 寻找没有被执行的任务对
递归的层级结构类似这样: