TypechoJoeTheme

Toasobi的博客

2016年的投资(判断唯一)

本文最后更新于2023年09月25日,已超过359天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

Insurance 表:

Column NameType
pidint
tiv_2015float
tiv_2016float
latfloat
lonfloat

pid 是这张表的主键(具有唯一值的列)。
表中的每一行都包含一条保险信息,其中:
pid 是投保人的投保编号。
tiv_2015 是该投保人在 2015 年的总投保金额,tiv_2016 是该投保人在 2016 年的总投保金额。
lat 是投保人所在城市的纬度。题目数据确保 lat 不为空。
lon 是投保人所在城市的经度。题目数据确保 lon 不为空。

编写解决方案报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和:

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

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

示例 1:

输入:

Insurance 表:
pidtiv_2015tiv_2016latlon
11051010
220202020
310302020
410404040
输出:
tiv_2016
45.00

解释:
表中的第一条记录和最后一条记录都满足两个条件。
tiv_2015 值为 10 与第三条和第四条记录相同,且其位置是唯一的。

第二条记录不符合任何一个条件。其 tiv_2015 与其他投保人不同,并且位置与第三条记录相同,这也导致了第三条记录不符合题目要求。
因此,结果是第一条记录和最后一条记录的 tiv_2016 之和,即 45 。

  • 方法一
为了判断一个值在某一列中是不是唯一的,我们可以使用 GROUP BY 和 COUNT
找出符合条件的所有子表,然后用in就可以了
对于两列集合判断唯一,需要用CONCAT(LAT, LON)
SELECT
    SUM(insurance.TIV_2016) AS TIV_2016
FROM
    insurance
WHERE
    insurance.TIV_2015 IN
    (
      SELECT
        TIV_2015
      FROM
        insurance
      GROUP BY TIV_2015
      HAVING COUNT(*) > 1
    )
    AND CONCAT(LAT, LON) IN
    (
      SELECT
        CONCAT(LAT, LON)
      FROM
        insurance
      GROUP BY LAT , LON
      HAVING COUNT(*) = 1
    )
;
  • 方法二
还可以使用自连接的方式判断唯一,以下为一个示范
select round(sum(distinct o1.TIV_2016), 2) tiv_2016
from insurance o1
inner join insurance o2 on o1.PID != o2.PID and o1.TIV_2015 = o2.TIV_2015
where (o1.LAT,o1.lon) not in (select lat, lon from insurance where o1.PID != PID)
朗读
赞(0)
评论 (0)