涉及MySQL表中重复项的计算

时间:2013-06-11 17:41:59

标签: mysql duplicates

我在EID(事件ID)和start_time上有一个包含复合主键的表。我有另一个名为出席的专栏。

用户通过重复使用事件ID和更改日期使他们的活动更受欢迎,但是,我在此实例中在数据库中创建了一个新行。

我想创建第4列,actual_attending等于参加值减去前一个事件的参加值。如果它们不是以前的ID,则该列可以为null。如何通过更新计算出来。

这是一个sqlfiddle作为示例:http://sqlfiddle.com/#!2/43f2c5

2 个答案:

答案 0 :(得分:0)

update event e1
set e1.actual_attending = (select e1.attending - e2.attending
                           from event e2
                           where e2.eid(+) = e1.previous_eid
                          )

答案 1 :(得分:0)

SELECT a.*
     , a.attending-b.attending new_actual_attending
  FROM 
     ( SELECT x.*
            , COUNT(*) rank
         FROM event x
         JOIN event y
           ON y.eid = x.eid
          AND y.start_time <= x.start_time
        GROUP
           BY eid, start_time
     ) a
  LEFT
  JOIN 
     ( SELECT x.*
            , COUNT(*) rank
         FROM event x
         JOIN event y
           ON y.eid = x.eid
          AND y.start_time <= x.start_time
        GROUP
           BY eid, start_time
     ) b
    ON b.eid = a.eid
   AND b.rank = a.rank - 1;

   +-----+------------+-----------+------------------+------+----------------------+
   | eid | start_time | attending | actual_attending | rank | new_actual_attending |
   +-----+------------+-----------+------------------+------+----------------------+
   |   1 | 2013-06-08 |        29 |             NULL |    1 |                 NULL |
   |   2 | 2013-06-09 |        72 |             NULL |    1 |                 NULL |
   |   2 | 2013-06-16 |       104 |             NULL |    2 |                   32 |
   |   3 | 2013-06-07 |       224 |             NULL |    1 |                 NULL |
   |   3 | 2013-06-14 |       222 |             NULL |    2 |                   -2 |
   +-----+------------+-----------+------------------+------+----------------------+

http://sqlfiddle.com/#!2/43f2c5/2