我的数据集包含来自不同行业的不同公司的每日(实际上是工作日)时间序列,并且我使用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