以部分重复的行更新表

时间:2014-02-26 18:34:34

标签: sql postgresql

我的数据集包含来自不同行业的不同公司的每日(实际工作日)时间序列,我使用PostgreSQL。我的数据集中有一个指标变量,取值为1,-1,大部分时间为0.为了更好的可读性,我指的是指标变量对于给定公司作为指标事件不等于零的情况。 p>

如果给定行业在某一天有多个指标事件,则尊重公司的指标变量应更新为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-01-16公司B和C的条目,因为它们都来自同一行业并且在同一天经历了指标事件。

我的想法是使用exists运算符:

    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,我无法弄清楚原因。

您是否有任何想法如何解决这个问题,或者如何用其他方法解决我的问题?

1 个答案:

答案 0 :(得分: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)