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;
上一篇:数据中心火灾为何屡禁不止


下一篇:项目集成-2015年上半年