我有如下表格:
con_no pr_no flag_1 flag_2
con_002 1000234 1 0
con_002 1000345 -1 0
con_002 1100200 1 1
con_002 1005890 0 0
Con_003 1100367 0 0
Con_003 1000445 1 1
Con_003 1200334 -1 0
con_003 1140567 1 0
現在我想讓另一列填入pr_no,其flag_2=1,并且在特定的con_no中flag_1=1。因此,結果表應該是這樣的
con_nopr_no flag_1 flag_2 Parent_pr
con_002 1000234 1 0 1100200 < ---這是屬于con_002的。
con_002 1000345 -1 0
con_002 1100200 1 1 1100200 < ---這是屬于con_002的。
con_002 1005890 0 0
con_003 1100367 0 0
con_003 1000445 1 1 1000445 < ---這屬于con_003。
con_003 1200334 -1 0
con_003 1140567 1 0 1000445 < ----這屬于con_003。
如何使用python(pandas)或SQL實作上述內容。實際上這個表在一個資料庫(postgreSQL)中。所以一個SQL查詢字串也可以做到。
不過有一個問題。每次程式運行時,con_no會被重新洗牌。一些pr_no可能被附加到一個新的或一個現有的(但不同的con_no)。
uj5u.com熱心網友回復:
你應該把表和它自己連接起來。如果你的資料在名為my_table的表中,像這樣的查詢應該是可行的:
with cte as (
select con_no, pr_no
from my_table
where flag_2 = 1)
select t.con_no, t.pr_no, t.flog_1, t.flog_2, cte.pr_no as parent_pf
from my_table as t
left outer join cte on (cte. con_no = t.con_no and t.flag_1 = 1)
uj5u.com熱心網友回復:
你可以使用一個視窗函式和條件邏輯:
select t.*,
(case when flag_1 = 1)
then max(case when flag_1 = 1) number">1 and flag_2 = 1 then Pr_no end) over (partition by con_no)
end) as parent_pr
from t。
實際上,Postgres支持filter語法,所以我應該這樣寫:
select t.*。
(case when flag_1 = 1)
then max(pr_no) filter (where flag_1 =) operator">= 1 and flag_2 = 1) over (partition by con_no)
end) as parent_pr
from t。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/307999.html
標籤:
