LeetCode:Database 23.2016年的投资

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

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

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

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 是投保人所在城市的经度。

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  |

Result Table:

| TIV_2016 |
|----------|
| 45.00    |

分析:
1.想要求取2016年投资成功的投保人的总金额,需要先筛选出在2015年投保金额相同且投保人数大于1的投保人信息,使用窗口聚合函数count() over()通过投保金额分组
2.再次筛选出城市不与其他人相同的投保人信息,使用窗口聚合函数count() over()通过维度、经度分组
3.通过以上两个筛选条件筛选出最终符合条件的投保人,将他们在2016年的投保总金额相加保留2位小数既是最终结果

SQL语句:

SELECT ROUND(SUM(tiv_2016),2) AS TIV_2016
FROM(
SELECT pid,tiv_2016,
COUNT(tiv_2015) over(PARTITION BY tiv_2015) AS c1,
COUNT(tiv_2015) over(PARTITION BY lat,lon) AS c2
FROM
insurance)a
WHERE c1>1 AND c2=1;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值