我有下表:
| 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。
谢谢!
答案 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