date attribute>
2002-04-14 C
2001-12-07 A
1990-12-19 A
1990-12-20 B
1991-01-29 A
1991-07-01 C
1990-07-25 B
1999-05-13 B
1990-09-25 A
我們需要添加一個布爾列,檢查date是否是attribute的最新條目。表中的desired_col:
date attribute desired_col
2002-04-14 C TRUE
2001-12-07 A TRUE
1990-12-19 A FALSE
1990-12-20 B FALSE
1991-01-29 A FALSE
1991-07-01 C FALSE
1990-07-25 B FALSE
1999-05-13 B TRUE
1990-09-25 A FALSE
這個是我能找到的最接近的東西,但會產生一個新的表,但我只想要一個列。
有人知道,有一個知識分子,他是一個很聰明的人。
一些有見識的人建議創建一個觸發器,但我不明白這些或它們的相關性。
如果有幫助的話,我們可以在pandas中用df['desired_col'] = (df.groupby('attribute')['date'].transform('max') == df['date'])做這個。我們怎樣才能在PostgreSQL中做到這一點?
uj5u.com熱心網友回復:
你可以在Postgresql查詢中使用視窗函式來實作這一點,例如
SELECT
df.date,
df.屬性。
df.date = MAX(df.date) OVER (PARTITION BY df. attribute) as desired_col
FROM[/span
df。
| 日期 | 屬性 | 期望col | ||
|---|---|---|---|---|
| 1990-09-25 | A | 2001-12-07 | 1990-12-19 | 1991-01-29 | A
View on DB Fiddle
如果這對你有用,請告訴我。
編輯1
。如果你想修改現有的表,那么你可以把desired_column添加為一個布爾列,默認值為false,然后運行一個更新,如下所示:
查詢 #1
ALTER TABLE df
ADD desired_column bool DEFAULT FALSE;
沒有要顯示的結果。
查詢#2
SELECT * FROM df。
| 日期 | 屬性 | 期望列 | |
|---|---|---|---|
| 2002-04-14T00:00:00.000Z | C | ||
| 2001-12-07T00:00:00.000Z | |||
| 1990-12-19T00:00:00.000Z | |||
| 1990-12-20T00:00:00.000Z | |||
| 1991-01-29T00:00:00.000Z | |||
| 1991-07-01T00:00:00.000Z | |||
| 1990-07-25T00:00:00.000Z | |||
| 1999-05-13T00:00:00.000Z | B | false | 1990-09-25T00:00:00.000Z |
查詢 #3
UPDATE df
SET
desired_column = true SET
FROM (
SELECT df2.attribute, MAX(df2.date) as max_date
FROM df as df2
GROUP BY df2. attribute
) df3
WHERE df.attribute = df3.attribute and
df.date = df3.max_date。
沒有要顯示的結果。
查詢 #4
SELECT * FROM df。
| 日期 | 屬性 | 期望列 |
|---|---|---|
| 1990-12-19T00:00:00.000Z | A | |
| 1990-12-20T00:00:00.000Z | ||
| 1991-01-29T00:00:00.000Z | ||
| 1991-07-01T00:00:00.000Z | ||
| 1990-07-25T00:00:00.000Z | ||
| 1990-09-25T00:00:00.000Z | ||
| 2002-04-14T00:00:00.000Z | ||
| 2001-12-07T00:00:00.000Z | ||
| 1999-05-13T00:00:00.000Z |
View on DB Fiddle
需要注意的是,從性能上來說,維護這一列可能是昂貴的,因為這可能意味著添加一條新的記錄將觸發和更新(這可以實作),但如果你確實需要物化視圖的性能,這并不理想。更有效的做法是擁有你的表,當需要該列的結果時,你可以運行一個查詢或查詢一個參考該表的視圖,例如。
CREATE OR REPLACE VIEW vw_df as
SELECT
df.date::text,
df.屬性。
df.date = MAX(df. OVER (PARTITION BY df. attribute) as desired_col
FROM[/span
df
ORDER BY
df.date DESC。
df.屬性。
讓我知道這是否對你有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324741.html
標籤:
