postgresql如何取中位数 sql获取中位数_sql怎么select中位数


0.对应的原始题目和完整题解可见gitub,上面还有自己现在在做的LeetCode热题Top100,基于C++,有需要的可以star一下,欢迎交流。


https://github.com/jinlukang1/Algorithm/tree/master/SQLgithub.com

从leetcode上刷了一些数据库的题目,题目的方法和技巧总结如下:

1.涉及排名多少的问题

对于给一个单表(工资表)去挑选前三高工资的员工,核心的做法是,从该表中选出一条数据之后,将该数据在另外一个表中去比较有几条数据比该数据大,从而推断出该数据的排名,核心的代码示意如下:


select


对于列出排名的题目,也有类似的做法


select


2.Join的用法

默认的join为inner join,还有left,right,outer等,对于这些方法,可以看下面的这个图,一目了然,根据实际需求,如果需要对其中一个表中的缺失的数据补充null时,需要参考这个,将表中为null的数据也显示出来。下面也出现了data_format的用法。


postgresql如何取中位数 sql获取中位数_数据_02


select


3.员工薪水中位数

这个题目就比较难了,由于中位数涉及到选择的时候需要有奇偶数的情况分别讨论,大概的做法是,先通过每个公司的人数统计,找出这几个中位数,再把这几个中位数对应的到薪水排名的表上,即用到排名的一般方法,就是两个表进行join,有些复杂,是数据库题目中出现的我做过的最难的一个。

代码如下:


SELECT


4.查询第几高的数据(第几高的薪水、价格等)

这种题目使用 LIMIT 输出个数 OFFSET 偏移个数 的方法去做就好,速度很快。当然比如第一名就直接LIMIT1即可,示例如下:


SELECT


5.IF函数的使用

涉及到IF函数的使用,经常会搭配一些聚合函数,比如count、sum等,具体用法为IF(condition, exp1, exp2),如果满足condition则输出为exp1,否则为exp2。注意count中不会计算null,然后sum不会计算0。

6.表join的小技巧

如果需要计算一个表中的聚合指标,去和另外一个表中的对比,可以选择将查询后的聚合指标作为一个表与另外一个表进行join,这样可以在查询过程中,调用另外一个表。

7.连续出现的数字、连续出现的座位等

出现这种考察连续出现的题目,一般情况下的解决方案是通过多个表进行join来完成,比如题目考察连续3次出现,那么你至少就要join3个表。


select


还有这个考察连续3天人流量的问题。由于需要输出是哪几天,所以还需要考虑去重以及情况考虑全面。


select


还要注意的是日期的连续,可以用DATEDIFF(a.RecordDate, b.RecordDate) = 1来表示。

三天的麻烦一些,但是两天的比较简单,也展示一下。


select


8.如果涉及到删除,可以先select需要删除的内容,再将select变为select即可。

9.涉及到序号变换的问题的题目

涉及到序号变换的问题的题目,比如交换位置等,可以直接在select的时候,对序号的内容做条件判断并进行变换。


select


10.如果补充不在范围内的数据

可以考虑用union进行数据的补充,然后select后面可以直接补充相关需要填补的内容,null或者其他数字。


select


11.子查询相关方法

子查询可以用在很多地方,子查询的结果是一个数据表,可以用在in后面,也可以作为一个表进行join,示例如下:


select


同时,子查询的结果如果是一个数的话,也可以直接用于基本运算,这样会写的很长。


select