在SQL中完成Excel中PRODUCT 功能

2021-08-22 19:22:40 字數 1060 閱讀 2532

excel中的product函式將所有以引數形式給出的數字相乘,並返回乘積值。我在計算使用者生存率的時候遇到了乙個問題。

(具體計算方法見部落格另一篇)

如下圖

g列為每個使用者任期的風險率,生存率為所有(1-風險率)的乘積,每乙個後續的生存率等於上乙個生存率值*(1減上乙個風險率)。

在excel中可以使用product,首先計算每一任期的生存率(1-風險率),並且通過 '$26' 固定第乙個單元格,完成 '累乘' 。列的某一行資料的計算,基於該列的前一行資料,這種型別的公式被成為遞迴公式。列方向上的一行行計算。

可惜sql中沒有product()聚合函式,使用對數:自然對數之和等於對數字做成績

select exp(sum(ln(1 - h)))

這個表示式求增量生存率的log值的和,然後反向計算log,這是一種迂迴但是高效的計算集合乘積的方法。

e^(ln(1-h0)+ln(1-h1)+……+ln(1-hn)) = e^(ln(1期生存率*2期生存率*……*n期生存率) = 1期生存率*2期生存率*……*n期生存率

這個計算公式是乙個簡單化的公式,因為所有的風險率並非都非負且小於1.常見的聚合乘積要考慮正負數以及0

邏輯:select (1 - 2 * mod(sum(case when col < 0 then 1 else 0 end), 2)) *

min(case when col = 0 then 0 else 1 end) * 

sum(exp(ln(abs(case when col = 0 then 1 else col end))))

第乙個表示式處理結果標識,計算小於0的數值的個數,如果計數結果為偶數,輸出1,如果為奇數,結果為-1

第二個表示式處理0值,如果為0,那麼結果為0。

第三個表示式實際處理乘積運算,新增很多處理,防止ln()報錯,abs確保正數,case確保不為0。

04 在 PR 中關閉 issue

在 pr 中關閉 issue 似乎要給別人pr。比如你在建立乙個 pull request 去修復 issue 234。那你可在 pr 輸入 fixes 234 就可以自動合併 pr 並關閉這個 issue,是不是很酷。在pr中,鏈結到 comment 鏈結到 既然能鏈結到 comment,那你想問...

批量處理excel到sql中

import xlrd from pymysql import import re import os,shutil import time 處理檔案,把g 2017年更新2018年樓盤 資料夾下打不開或者格式不結構的檔案移動到g 新建資料夾 下 def wenjianchuli file dir ...

實現資訊在excel中輸出

protected void button3 click object sender,eventargs e 方法二 gridview輸出到excel 自已後台構建乙個gridview public void getexcel string strwhere1 方法二補充 把頁面上的gridview...