news 2026/10/31 8:53:48

LeetCode 585题解析:SQL查询与投资数据分析实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 585题解析:SQL查询与投资数据分析实战

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 核心查询条件

需要满足两个条件:

  1. 该投保人在2015年的投资金额(tiv_2015)与至少一个其他投保人相同
  2. 该投保人所在位置(lat, lon)与其他所有投保人都不同

3. 解决方案设计

3.1 查询思路拆解

要实现这个查询,需要分三步处理:

  1. 筛选2015年投资金额不唯一的记录
  2. 确保地理位置唯一的记录
  3. 对符合条件的记录计算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 子查询的运用

这里使用了两个子查询:

  1. 第一个子查询找出2015年投资金额出现多次的值
  2. 第二个子查询找出只出现一次的地理位置组合

注意:MySQL中可以直接使用元组(lat, lon)进行IN判断,但在某些数据库如SQL Server中可能需要改用CONCAT或单独判断

4.2 聚合函数与HAVING

HAVING子句用于对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_2016

7. 业务场景扩展

这种查询模式在实际业务中应用广泛:

  1. 识别"在同一地区有多笔投资的客户"(将唯一条件改为非唯一)
  2. 找出"投资金额相同但地区分散的保单"(调整条件逻辑)
  3. 分析"特定年份投资金额的变化情况"(修改时间条件)

8. 学习建议

对于想系统提升SQL能力的学习者,建议:

  1. 从基础语法开始,掌握SELECT/WHERE/GROUP BY等核心语句
  2. 重点学习子查询、JOIN等高级用法
  3. 多做LeetCode数据库题目,按难度循序渐进
  4. 在实际业务场景中思考SQL的应用

这道题作为中等难度题目,很好地考察了:

  • 多条件过滤的逻辑组合能力
  • 子查询的灵活运用
  • 对数据唯一性的理解
  • 聚合函数的使用技巧

我在实际工作中发现,很多初级数据分析师最容易犯错的就是对唯一性条件的理解。建议在写复杂SQL时,先用注释写明每个条件的业务含义,再转化为SQL语法,这样可以减少逻辑错误。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 8:53:48

第三方接口对接实战:从原理到企业级解决方案

1. 第三方接口对接的核心逻辑 第三方接口对接的本质是让不同系统之间实现数据互通。想象一下,你正在搭建一个电商网站,需要调用支付宝的支付功能,或者想在个人博客上展示最新的Twitter动态——这些场景都需要通过第三方接口来实现系统间的&q…

作者头像 李华
网站建设 2026/10/31 8:52:35

Linaro GCC 4.6.2交叉编译链部署与兼容性实战指南

简介:本资源为面向嵌入式与Linux系统开发者的交叉编译工具链集成包,适用于ARM/MIPS等多架构环境下的固件开发、系统移植及兼容性测试。包含GCC 4.6.2编译器套件、GLIBC 2.13运行时库及Linaro组织深度优化的multilib支持组件,可同时满足32/64位…

作者头像 李华
网站建设 2026/10/31 8:51:31

新闻App评论系统架构演进与高性能实践

1. 新闻App评论系统的演进背景十年前我刚入行时,新闻客户端的评论区还停留在"盖楼式"的简单交互。当时的技术架构用现在的眼光看简直原始得可爱——单台MySQL实例扛所有读写,前端用jQuery直接拼接HTML字符串,连基本的敏感词过滤都要…

作者头像 李华
网站建设 2026/10/31 8:51:19

AI建站工具评测与选型指南

1. AI建站工具的市场现状与核心价值 过去三年里,AI建站工具的市场规模增长了近300%,仅2023年就有超过200万中小企业和个人开发者通过这类工具快速上线了自己的网站。作为从业12年的全栈开发者,我见证了这个领域从最初的模板拖拽到如今智能生成…

作者头像 李华
网站建设 2026/10/31 8:51:15

异步流+背压+取消:Python本地推理界面卡顿解决方案

1. 从一个让人抓狂的现象说起模型明明已经开始一个字一个字往外蹦了,界面却像被冻住一样,转圈、白屏、按钮点不动,甚至整个窗口直接“无响应”。这个场景我猜很多做过本地推理应用的朋友都遇到过,尤其是用 Python 把大模型跑在本地…

作者头像 李华
网站建设 2026/10/31 8:50:37

RPA助力中小企业实现Excel与客服自动化

1. 项目概述:RPA如何为中小企业降本增效 电商客服和财务人员每天都要面对大量重复性工作:处理Excel报表、回复客户消息、跟踪订单状态。这些工作往往占据3-5小时/天,却创造不了核心价值。灵梭RPA作为一款国产免费自动化工具,通过可…

作者头像 李华