SQL-每日一题【585.2016年的投资】

题目

Insurance 表:

SQL-每日一题【585.2016年的投资】_第1张图片

请你编写一个 SQL 查询,报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和:

  • 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
  • 他所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)。

tiv_2016 四舍五入的 两位小数 。

查询结果格式如下例所示。

示例:

SQL-每日一题【585.2016年的投资】_第2张图片

 

 

解题思路

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)

测试结果

SQL-每日一题【585.2016年的投资】_第3张图片

 

你可能感兴趣的:(SQL每日一题,sql,算法,数据库)