寫乙個查詢語句,將 2016 年 (tiv_2016) 所有成功投資的金額加起來,保留 2 位小數。對於乙個投保人,他在 2016 年成功投資的條件是:1. 他在 2015 年的投保額 (tiv_2015) 至少跟乙個其他投保人在 2015 年的投保額相同。2. 他所在的城市必須與其他投保人都不同(也就是說維度和經度不能跟其他任何乙個投保人完全相同)。
pid 欄位是投保人的投保編號, tiv_2015 是該投保人在2023年的總投保金額, tiv_2016 是該投保人在2023年的投保金額, lat 是投保人所在城市的維度, lon 是投保人所在城市的經度。
就如最後乙個投保人,第乙個投保人同時滿足兩個條件:
第二個投保人兩個條件都不滿足。他在 2015 年的投資 tiv_2015 與其他任何投保人都不相同。
且他所在城市的經緯度與第三個投保人相同。基於同樣的原因,第三個投保人投資失敗。
所以返回的結果是第乙個投保人和最後乙個投保人的 tiv_2016 之和,結果是 45 。
create table if not exists insurance (pid integer(11), tiv_2015 numeric(15,2), tiv_2016 numeric(15,2), lat numeric(5,2), lon numeric(5,2) )
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')
partition by tiv_2015,如果大於1,就說明至少跟乙個其他投保人在 2015 年的投保額相同
partition by lat, lon,符合等於1的,說明經緯度獨一無二
select round(sum(tiv_2016), 2) as tiv_2016 ##查詢保留兩位數
from(
select *,
count(1) over(partition by tiv_2015) as cnt_1, ##統計數量 開窗函式
count(1) over(partition by lat, lon) as cnt_2
from
insurance
) a
where a.cnt_1 > 1 and a.cnt_2 = 1
本題剛接觸時真的是 知道怎麼做就是不會寫,也是查閱了一些資料,然後找到了最簡單的。但是 over() partition by() 語句需要掌握的牢固.
LeetCode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
leetcode 打家劫舍
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
LeetCode 程式設計
給乙個包含 n 個整數的陣列 s,找到和與給定整數 target 最接近的三元組,返回這三個數的和。for example,given array s and target 1.the sum that is closest to the target is 2.1 2 1 2 解答部分 publi...