标签:知识点 end over when number num flag2 flag1 row
这道题在面试中出现频次较高,因为一道题既可以考核case when 用法,也可以考核窗口函数用法,还可以考核聚合函数和运算符用法,一举三得,完成这道题需要有清晰的思路,对题目的理解。
首先,理解中位数的概念:是按顺序排列的一组数据中居于中间位置的数。
奇数情况:由低到高排序,取中间那个值。
偶数情况:由低到高排序,取最中间的两个数值的平均数。
因此sql写法要一次性考虑到两种情况,完整代码如下:
select sum(case when flag1=flag2 then num else null end) num1
,sum(case when flag2-flag1 =1 or flag2-flag1 =-1 then num else null end)/2 num2
from(
select num,row_number() over(order by num) flag1
,row_number() over(order by num desc) flag2
from t ) a
讨论:排序问题除了用order by,其次还要想到row_number() over() 函数;使用窗口函数解题较为巧妙;count()函数也可以解题,但是可能会产生笛卡尔集,倾向于减少数据量,提升取数效率,有些数据库也不支持产生笛卡尔集,同时也不能体现对多个知识点的掌握。
第一步:排序,正序和倒序
select num,row_number() over(order by num) flag1
,row_number() over(order by num desc) flag2
from t
如果是奇数情况,则
如果是偶数情况,则
第二步,flag相减寻找规律:
select case when flag1=flag2 then num else null end num1
,case when flag2-flag1 =1 or flag2-flag1 =-1 then num else null end num2
from(
select num,row_number() over(order by num) flag1
,row_number() over(order by num desc) flag2
from t ) a
如果是奇数情况,则0对应的值为中位数值
如果是偶数情况,则1和-1对应的和的平均值就是中位数值
第三步:计算中位数值
select sum(case when flag1=flag2 then num else null end) num1
,sum(case when flag2-flag1 =1 or flag2-flag1 =-1 then num else null end)/2 num2
from(
select num,row_number() over(order by num) flag1
,row_number() over(order by num desc) flag2
from t ) a
如果是奇数情况,则
如果是偶数情况,则
标签:知识点,end,over,when,number,num,flag2,flag1,row 来源: https://blog.csdn.net/qq_34019697/article/details/118633518
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。