2014-02-26 89 views
3

我的數據集包含來自不同行業的不同公司的日常(實際上是工作日)時間序列,我使用PostgreSQL。我的數據集中有一個指標變量,取值爲1,-1和大部分時間爲0.爲了更好地理解問題,我指的是指標變量對於給定公司指標事件不等於零的情況。行中部分重複的更新表

如果對於一個給定的行業不止一個指示器事件在某一天,在尊重公司的指標變量應更新爲0

我們可以把下面的示例數據集:

day    company  indicator  industry 
2012-01-12  A   1    financial 
2012-01-12  B   1    consumer 
2012-01-12  C   0    consumer 
2012-01-13  A   0    financial 
2012-01-13  B   1    consumer 
2012-01-13  C   0    consumer 
2012-01-16  A   1    financial 
2012-01-16  B   -1   consumer 
2012-01-16  C   1    consumer 

因此,應更新爲零的指標值將在2012年1月16日公司B和C的條目中顯示,因爲它們都來自同一行業並在同一天經歷了指標事件。

我的想法是工作與經營者存在:

update mytable t1 set indicator = 0 
    where exists (
       select 1 
       from mytable t2 
       where t2.day = t1.day 
       and t2.industry = t1.industry 
       and t2.indicator <> 0 
       and t1.indicator <> 0) 

但不知何故,所有的指標值更新爲0,我想不通爲什麼。

你有什麼想法如何解決這個問題,或者如何用另一種方法解決我的問題?

+0

如果{day,company,industry}都一樣,您是否有額外的關鍵字段(例如「id」)來區分記錄? – wildplasser

+0

@wildplasser不,但我也想過。我可以添加它與CREATE SEQUENCE id_seq; ALTER TABLE mytable ADD id INT UNIQUE; ALTER TABLE mytable ALTER COLUMN ID SET DEFAULT NEXTVAL('id_seq'); UPDATE TABLE mytable SET id = NEXTVAL('id_seq'); ALTER TABLE mytable ADD PRIMARY KEY(id) – user3319629

+0

@wildplasser但是你問的問題不會發生,因爲組合(日,公司)總是不同的 – user3319629

回答

1

您可能希望添加一個條件來不將自己加入行中(這總是正確的),例如,

update mytable t1 set indicator = 0 
where exists (
      select 1 
      from mytable t2 
      where t2.day = t1.day 
      and t1.company <> t2.company 
      and t2.industry = t1.industry 
      and t2.indicator <> 0 
      and t1.indicator <> 0) 
+0

是的,那正是缺少的。非常感謝您的回答! @erikxiv – user3319629