LeetCode 585题解析:SQL查询与投资数据分析实战
发布时间:2026/10/31 8:54:00 锦皓数字建站

1. 题目背景与核心需求这道LeetCode数据库题目编号585标题为2016年的投资考察的是对SQL查询语句的综合运用能力。题目要求从给定的保险投资数据表中筛选出符合特定条件的2016年投资记录并计算相关统计指标。在实际业务场景中这类查询非常常见。保险公司需要定期分析不同年份的投资分布情况识别优质客户或异常交易。题目模拟了真实数据分析工作中按时间维度筛选条件过滤聚合计算的典型需求。2. 数据表结构分析根据题目描述主要涉及两个表2.1 保险表(Insurance)-------------------- | Column Name | Type | -------------------- | pid | int | -- 保单ID | tiv_2015 | float | -- 2015年投资金额 | tiv_2016 | float | -- 2016年投资金额 | lat | float | -- 纬度 | lon | float | -- 经度 --------------------2.2 核心查询条件需要满足两个条件该投保人在2015年的投资金额(tiv_2015)与至少一个其他投保人相同该投保人所在位置(lat, lon)与其他所有投保人都不同3. 解决方案设计3.1 查询思路拆解要实现这个查询需要分三步处理筛选2015年投资金额不唯一的记录确保地理位置唯一的记录对符合条件的记录计算2016年投资总额3.2 SQL实现方案SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016 FROM 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(*) 1 )4. 关键技术点解析4.1 子查询的运用这里使用了两个子查询第一个子查询找出2015年投资金额出现多次的值第二个子查询找出只出现一次的地理位置组合注意MySQL中可以直接使用元组(lat, lon)进行IN判断但在某些数据库如SQL Server中可能需要改用CONCAT或单独判断4.2 聚合函数与HAVINGHAVING子句用于对GROUP BY后的结果进行过滤COUNT(*) 1找出重复值COUNT(*) 1找出唯一值4.3 精度处理使用ROUND函数将结果保留两位小数符合金融数据的常规显示要求。5. 性能优化建议5.1 索引设计为提高查询效率建议在以下列上创建索引CREATE INDEX idx_tiv_2015 ON Insurance(tiv_2015); CREATE INDEX idx_location ON Insurance(lat, lon);5.2 替代写法使用EXISTS可能比IN更高效SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016 FROM Insurance i1 WHERE EXISTS ( SELECT 1 FROM Insurance i2 WHERE i1.pid ! i2.pid AND i1.tiv_2015 i2.tiv_2015 ) AND NOT EXISTS ( SELECT 1 FROM Insurance i3 WHERE i1.pid ! i3.pid AND i1.lat i3.lat AND i1.lon i3.lon )6. 常见错误与排查6.1 错误示例1忽略唯一性条件-- 错误只考虑了tiv_2015重复没考虑位置唯一 SELECT SUM(tiv_2016) FROM Insurance WHERE tiv_2015 IN (...)6.2 错误示例2错误的地理位置判断-- 错误分开判断lat和lon的唯一性 WHERE lat IN (...) AND lon IN (...) -- 正确应该作为组合判断 WHERE (lat, lon) IN (...)6.3 错误示例3精度问题-- 错误未处理小数位数 SELECT SUM(tiv_2016) AS tiv_2016 -- 正确应该四舍五入 SELECT ROUND(SUM(tiv_2016), 2) AS tiv_20167. 业务场景扩展这种查询模式在实际业务中应用广泛识别在同一地区有多笔投资的客户将唯一条件改为非唯一找出投资金额相同但地区分散的保单调整条件逻辑分析特定年份投资金额的变化情况修改时间条件8. 学习建议对于想系统提升SQL能力的学习者建议从基础语法开始掌握SELECT/WHERE/GROUP BY等核心语句重点学习子查询、JOIN等高级用法多做LeetCode数据库题目按难度循序渐进在实际业务场景中思考SQL的应用这道题作为中等难度题目很好地考察了多条件过滤的逻辑组合能力子查询的灵活运用对数据唯一性的理解聚合函数的使用技巧我在实际工作中发现很多初级数据分析师最容易犯错的就是对唯一性条件的理解。建议在写复杂SQL时先用注释写明每个条件的业务含义再转化为SQL语法这样可以减少逻辑错误。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。