每日leetcode

585. 2016年的投资 - 力扣(LeetCode)

题目

Insurance 表:

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| pid         | int   |
| tiv_2015    | float |
| tiv_2016    | float |
| lat         | float |
| lon         | float |
+-------------+-------+
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 表:
+-----+----------+----------+-----+-----+
| pid | tiv_2015 | tiv_2016 | lat | lon |
+-----+----------+----------+-----+-----+
| 1   | 10       | 5        | 10  | 10  |
| 2   | 20       | 20       | 20  | 20  |
| 3   | 10       | 30       | 20  | 20  |
| 4   | 10       | 40       | 40  | 40  |
+-----+----------+----------+-----+-----+
输出:
+----------+
| tiv_2016 |
+----------+
| 45.00    |
+----------+
解释:
表中的第一条记录和最后一条记录都满足两个条件。
tiv_2015 值为 10 与第三条和第四条记录相同,且其位置是唯一的。

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

思路

  1. 在Insurance表中计算满足条件的tiv_2016的投保额,并倒序取第一个,结果更名为tiv_2016,子查询条件分别有:
    1. lat和lon在根据lat,lon做group by的结果组里数据数不超过2;
    2. tiv_2015在根据tiv_2015做group by的结果组里数据数大于1。

代码实现

# Write your MySQL query statement below
select round(sum(tiv_2016),2) as tiv_2016
from Insurance
where (lat, lon) in (
    select lat, lon
    from Insurance
    group by lat, lon
    having count(*)<2
) and tiv_2015 in (
    select tiv_2015
    from Insurance
    group by tiv_2015
    having count(*)>1
)
order by tiv_2016 desc
limit 1

知识积累

  • group by可以根据多个属性列来做,但是不要把他们用括号括住。

官方题解

  • 思路基本一致,但是中间提出的一个语句我觉得还是有可取之处的,做子查询时如果想要表示被挑选的内容是捆绑的,可以使用concat(属性列表),表示这些属性是被捆绑在一起考虑的——不知道有没有什么现实作用,但是对于代码可读性来说是一个挺不错的做法——官解中用在了lat,lon于where in和内部的select部分——没有改变主题的逻辑,就不复现了。

你可能感兴趣的:(leetcode训练,leetcode,算法,职场和发展,mysql,数据库)