0

我有下表:

| 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(Date of Birth) - row_above_current_row(Date of Death))>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,Result = 1 if( (其中 id=2).Date_of_Birth - (其中 id_minus_one=id-1).Date_of_Death )>X else 0

对于 id=3,Result = 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。

谢谢!

4

1 回答 1

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
于 2013-05-09T14:14:06.413 回答