力扣sql刷题系列

本文介绍了力扣上的一系列SQL题目,涉及2016年投资金额计算、好友申请通过率、最多好友人数查询、连续空余座位报告以及点的最近距离和二级关注者统计等。通过对保险数据、社交网络数据的分析,展示了解题思路和SQL解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

585. 2016年的投资
Create Table If Not Exists Insurance (pid int, tiv_2015 float, tiv_2016 float, lat float, lon float)
Truncate table Insurance
insert into Insurance (pid, tiv_2015, tiv_2016, lat, lon) values ('1', '10', '5', '10', '10')
insert into Insurance (pid, tiv_2015, tiv_2016, lat, lon) values ('2', '20', '20', '20', '20')
insert into Insurance (pid, tiv_2015, tiv_2016, lat, lon) values ('3', '10', '30', '20', '20')
insert into Insurance (pid, tiv_2015, tiv_2016, lat, lon) values ('4', '10', '40', '40', '40')

写一个查询语句,将 2016 年 (TIV_2016) 所有成功投资的金额加起来,保留 2 位小数。

对于一个投保人,他在 2016 年成功投资的条件是:

他在 2015 年的投保额 (TIV_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
他所在的城市必须与其他投保人都不同(也就是说维度和经度不能跟其他任何一个投保人完全相同)。

输入格式:
表 insurance 格式如下:

| Column Name | Type          |
|-------------|---------------|
| PID         | INTEGER(11)   |
| TIV_2015    | NUMERIC(15,2) |
| TIV_2016    | NUMERIC(15,2) |
| LAT         | NUMERIC(5,2)  |
| LON         | NUMERIC(5,2)  |

PID 字段是投保人的投保编号, TIV_2015 是该投保人在2015年的总投保金额, TIV_2016 是该投保人在2016年的投保金额, LAT 是投保人所在城市的维度, LON 是投保人所在城市的经度。

样例输入

| 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    |

解释

就如最后一个投保人,第一个投保人同时满足两个条件:
1. 他在 2015 年的投保金额 TIV_2015 为 '10' ,与第三个和第四个投保人在 2015 年的投保金额相同。
2. 他所在城市的经纬度是独一无二的。

第二个投保人两个条件都不满足。他在 2015 年的投资 TIV_2015 与其他任何投保人都不相同。
且他所在城市的经纬度与第三个投保人相同。基于同样的原因,第三个投保人投资失败。

所以返回的结果是第一个投保人和最后一个投保人的 TIV_2016 之和,结果是 45 。

题解一

# Write your MySQL query statement below
select round(sum(TIV_2016),2) TIV_2016 from (select TIV_2016,count(*) over(partition by TIV_2015) as count_tiv_2015,count(*) over(partition by LAT,LON) as count_lat_lon from insurance) as temp where count_tiv_2015  > 1 and count_lat_lon=1;

筛选出一个人在 2015 年投保额至少和任何一个人在 2015 年的投保额相同,就是按照 2015 年的投保额进行分组,并计算个数

count(*) over(partition by tiv_2015) count_tiv_2015

筛选不同的地点,就是按照经纬度进行分组,计算每个每个经纬度的个数

count(*) over(partition by lat, lon) count_lat_lon

题解二

select round(sum(TIV_2016),2) TIV_2016 from insurance where TIV_2015 in (select b.TIV_2015 from insurance b group by b.TIV_2015  having count(*) > 1) and concat(lat,lon) in (select concat(lat,lon) from insurance group by lat,lon having count(*) = 1 );

使用子查询

筛选出一个人在 2015 年投保额至少和任何一个人在 2015 年的投保额相同,使用 group by 按照 tiv_2015 分组,并且使用 count() 计算,筛选出大于 1 的数据,因为大于 1 代表至少有两个人在 2015 年投保额相同

select tiv_2015 from insurance group by tiv_2015 having count(*) > 1;

筛选不同的地点,就是按照 lat 和 lon 进行分组,这里查询的字段是使用 concat() 连接 la

Case When语句可以用来根据给定的条件来判断性别。使用Case When语句时,我们可以在When后面写上条件,然后在Then后面写上对应的结果。比如,如果我们想把性别为1的记录标记为“男性”,性别为2的记录标记为“女性”,那么我们可以使用以下的Case When语句: ```sql Case When sex = 1 Then '男性' When sex = 2 Then '女性' End ``` 这段代码将根据不同的性别值返回相应的结果。注意,如果没有匹配到任何条件,那么Case When语句将返回Null。此外,如果我们想要处理一个范围的条件,可以使用Between关键字,比如: ```sql Case When age Between 18 and 30 Then '青年' When age Between 31 and 50 Then '中年' Else '其他' End ``` 这段代码将根据年龄的范围返回相应的结果。需要注意的是,每个条件都是按照顺序依次判断的,如果一个条件满足,那么后面的条件不会再被判断。另外,我们还可以在Case When语句的末尾添加一个Else子句,用于处理所有未被匹配到的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [case when](https://blog.youkuaiyun.com/weixin_39864101/article/details/111852552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [力扣学习SQL篇——1-5 修改(变更性别——使用判断if/case when)](https://blog.youkuaiyun.com/weixin_43987277/article/details/126320938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值