我的數據集包含來自不同行業的不同公司的每日(實際上是工作日)時間序列,並且我使用PostgreSQL。我的數據集中有一個指標變量,取值爲1,-1和大部分時間爲0.爲了更好地讀取問題,我將指標變量不等於零作爲指標事件的日期。通過特定列對以前時間範圍內的行進行計數
因此,對於前三個工作日內同一行業的另一個指標事件之前的所有指標事件,指標變量應更新爲零。
我們可以把下面的示例數據集:
day company industry indicator
2012-01-12 A financial 1
2012-01-12 B consumer 0
2012-01-13 A financial 1
2012-01-13 B consumer -1
2012-01-16 A financial 0
2012-01-16 B consumer 0
2012-01-17 A financial 0
2012-01-17 B consumer 0
2012-01-17 C consumer 0
2012-01-18 A financial 0
2012-01-18 B consumer 0
2012-01-18 C consumer 1
所以這應更新爲0的指標值2012-01-13用於公司A的條目,2012-01-18 C公司的條目,因爲它們在3個工作日內在同一行業中發生過另一個指標事件。
我試圖完成它以下列方式:
UPDATE test SET indicator = 0
WHERE (day, industry) IN (
SELECT day, industry
FROM (
SELECT industry, day,
COUNT(CASE WHEN indicator <> 0 THEN 1 END)
OVER (PARTITION BY industry ORDER BY day
ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) As cnt
FROM test
) alias
WHERE cnt >= 2)
我的想法是計算當天的指標活動,並通過行業劃分的3前段日子。如果它計數超過1,它將指標值更新爲零。
弱點是,到目前爲止,它在前三行(按行業劃分)而不是前三個工作日。因此,在示例數據中,它無法在2012年1月18日更新公司C,因爲它計算的是行業=消費者的最後三行,而不是計算最近三個工作日內行業=消費者的所有行。
我嘗試了不同的方法,例如在代碼的第三行添加另一個子查詢,或者在第三行之後添加一個WHERE EXISTS
- 以確保代碼統計上述三個日期。但沒有任何工作。我真的不知道該怎麼做(我只是學習使用PostgreSQL)。
你有什麼想法如何解決它?
或者我正在考慮一個完全錯誤的方向,你知道另一種方法如何解決我的問題?
如果每三個工作日有相同行業的指標會發生什麼情況?你是否重置了每個指標,但第一個?你不應該有一個靜態網格嗎?例如,「只挑選星期一至星期三的第一起事件,以及星期四至星期五的第一起事件」。 –
是的,在那種情況下,我會重置每個指標,但第一個。因此,您的解決方案非常完美,非常感謝您。 @ErwinBrandstetter – user3319629