小工具知识网

当前位置: 首页 > 行业知识 > 【力扣白嫖日记】585.2016年的投资

行业知识

【力扣白嫖日记】585.2016年的投资

2026-10-30 08:36:34 来源:互联网转载

前言

���习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。

今日题目:

585.2016年的投资

表:Person

列名类型
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 四舍五入的 两位小数 。

    我那不值一提的想法:

    • 首先梳理表内容,题干只给了一张保险表,记录了投保编号,投保人2015年的总投保金额,2016年的总投保金额,投保人所在城市的维度和经度

    • 其次分析需求,需要求满足以下条件投保金额之和

    • 1.在2015年的投保额至少跟一个其他投保人在2015年的投保额相同

      • 在这个地方就有两个思路:
        • a.通过自连接,然后判断条件pid相同,tiv_2015不同
        • b.通过子查询查询临时表。建立一个临时表,这个临时表对tiv_2015进行分组,只要tiv_2015的数量大于1,就证明至少有一个是相等的。
        • 2.他所在的城市必须与其他投保人都不同

          通过子查询,对lat,lon进行分组,使得lat和lon的数量等于1,这样就可以保证

          查询结果的经纬度不重复

        • 思路一

          select round(sum(tiv_2016),2) as tiv_2016from Insurance where tiv_2015 in (   select tiv_2015    from Insurance    group by tiv_2015    having count(*) > 1 )and (lat,lon) in(    select lat,lon    from Insurance    group by lat,lon    having count(lat) = 1 and count(lon) = 1)
          • 思路二
            select round(sum(distinct i1.tiv_2016),2) as tiv_2016from Insurance i1 ,Insurance i2where i1.pid != i2.pid and i1.tiv_2015 = i2.tiv_2015and (i1.lat,i1.lon)in(    select lat,lon    from Insurance    group by lat,lon    having count(lat) = 1 and count(lon) = 1) 

            结果:

            • 思路一
            • 思路二

              总结:

              能运行就行。


上一篇:掌握上下轮播切换秘籍,打造吸引人的动态展示!

下一篇:淘宝联盟怎么建网站?