题目
Insurance
表:
请你编写一个 SQL 查询,报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和:
- 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
- 他所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)。
tiv_2016 四舍五入的 两位小数 。
查询结果格式如下例所示。
示例:
解题思路
1.题目要求我们查找在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同且所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)的投保人,那么我们按条件进行筛选。
2.首先满足在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同的条件,我们先将tiv_2015进行分组,并且只返回每个分组中记录数大于1的分组。
3.其次我们满足条件二,也就是投保人的(lat,lon)只能是唯一的。我们对(lat,lon)进行分组,并且只返回每个分组中记录数等于1的分组。
4.最后我们筛选出满足条件的tiv_2016进行相加,并且保留两位小数即可。
代码实现
select round(sum(tiv_2016),2)as tiv_2016
from Insurance e
Where e.tiv_2015 in (select e1.tiv_2015 from Insurance e1 group by tiv_2015 having count(1) > 1)
and (e.lat,e.lon) in(select e1.lat,e1.lon from Insurance e1 group by e1.lat,e1.lon having count(1)=1)
测试结果