簡體   English   中英

postgresql:表中給定id y的id x的最后一次出現值

[英]postgresql: last occurred value of id x for a given id y in a table

嗨,我是Postgresql的新手,需要一點幫助。

我有下表,其中基於列pf的值,行屬於1類或2類。 這些行按charttime排序。

我想要一個稱為prev_val的新列,並且prev_val對應的行應等於對應行類的diff類的最后出現的值。 即,如果給定行的pf = 2,則該行的prev_val必須等於pf = 1的行的先前值。

對於給定的pf = 2,pf = 1的prev_val = valuenum,charrttime小於當前行

對於給定的pf = 1,pfv = 2的prev_val = valuenum,charrttime小於當前行

您正在尋找lag()函數。 如果我正確理解了這個問題:

select t.*,
       lag(valuenum) over (partition by pf order by charttime) as prev_val
from t;

編輯:

表達邏輯的一種方法是:

select t.*,
       (case when pf = 1
             then lag(case when pf = 2 then valuenum end ignore nulls) over (partition by pf order by charttime) 
             then lag(case when pf = 1 then valuenum end ignore nulls) over (partition by pf order by charttime) 
        end) as prev_other_val
from t;

不幸的是,Postgres尚不支持ignore nulls ,因此這行不通。 以下可能有效:

select t.*,
       (case when pf = 1
             then lag(valuenum) filter (where pf = 2) over (partition by pf order by charttime) 
             then lag(valuenum) filter (where pf = 1) over (partition by pf order by charttime) 
        end) as prev_other_val
from t;

這將使用filter子句以達到相同(且效率更高)的效果。

橫向連接或子查詢肯定應該起作用(但不適用於大表):

select t.*,
       (select t2.valuenum
        from t t2
        where t2.pf <> t.pf and t2.chartime < t.chartime
        order by t2.chartime desc
        fetch first 1 row only
       ) as prev_other_val
from t;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM