从MySQL中当前行上方的行中减去值

时间:2013-05-09 14:00:32

标签: mysql sql row subtraction

我有下表:

| id | Name | Date of Birth | Date of Death | Result |
| 1  | John | 3546565       | 3548987       |        |
| 2  | Mary | 5233654       | 5265458       |        |
| 3  | Lewis| 6546876       | 6548752       |        |
| 4  | Mark | 6546546       | 6767767       |        |
| 5  | Steve| 6546877       | 6548798       |        |

我需要为整个表格执行此操作:

结果= 1,if(current_row(出生日期) - row_above_current_row(死亡日期))> X else 0

为了简化操作,我想,我创建了相同的表格,但有2个额外的ID字段:id_minus_one和id_plus_one

像这样:

| id | id_minus_one | id_plus_one |Name | Date_of_Birth | Date_of_Death | Result |
| 1  | 0            | 2           |John | 3546565       | 3548987       |        |
| 2  | 1            | 3           |Mary | 5233654       | 5265458       |        |
| 3  | 2            | 4           |Lewis| 6546876       | 6548752       |        |
| 4  | 3            | 5           |Mark | 6546546       | 6767767       |        |
| 5  | 4            | 6           |Steve| 6546877       | 6548798       |        |

所以我的方法就像(在伪代码中):

对于id = 1,忽略结果。 (因为上面没有行)

表示id = 2,结果= 1 if((其中id = 2).Date_of_Birth - (其中id_minus_one = id-1).Date_of_Death)> X else 0

表示id = 3,结果= 1 if((其中id = 3).Date_of_Birth - (其中id_minus_one = id-1).Date_of_Death)> X else 0

以及整个表格等等......

如果不需要id_plus_one,请忽略它,我稍后会用它来做同样的事情。因此,如果我设法为id_minus_one执行此操作,我将管理id_plus_one,因为它们是相同的算法。

我的问题是如何将该伪代码传递给SQL代码,我找不到一种方法只需一个选择来关联两个ID。

谢谢!

1 个答案:

答案 0 :(得分:1)

正如您所描述的那样,它只是一个自我联接,在选择中有一些逻辑:

select t.*,
       ((t.date_of_birth - tprev.date_of_death) > x) as flag
from t left outer join
     t tprev
     on t.id_minus_one = tprev.id