PostgreSQL比较从一行到下一行(不同列)的值



我有一个名为user_dates的邂逅表,按'user'和'start'排序,如下所示。我想创建一个列,显示30天内是否有另一次相遇。基本上我要逐行检查是否&;encounter_stop&;在"邂逅"开始后30天内

user   |  encounter_start  | encounter_stop
A  |  4-16-1989        | 4-20-1989
A  |  4-24-1989        | 5-1-1989
A  |  6-14-1993        | 6-27-1993
A  |  12-24-1999       | 1-2-2000
A  |  1-19-2000        | 1-24-2000
B  |  2-2-2000         | 2-7-2000
B  |  5-27-2001        | 6-4-2001

我想要一张这样的表:

user   |  encounter_start  | encounter_stop | subsequent_encounter_within_30_days
A  |  4-16-1989        | 4-20-1989      | 1
A  |  4-24-1989        | 5-1-1989       | 0
A  |  6-14-1993        | 6-27-1993      | 0
A  |  12-24-1999       | 1-2-2000       | 1
A  |  1-19-2000        | 1-24-2000      | 0
B  |  2-2-2000         | 2-7-2000       | 1
B  |  5-27-2001        | 6-4-2001       | 0

您可以select..., exists <select ... criteria>,这将返回一个布尔值(总是true或false),但如果真的想要1或0,只需将结果转换为整数:true=>1和false=>0。看到演示

select ts1.user_id
, ts1.encounter_start 
, ts1. encounter_stop  
, (exists ( select null
from test_set ts2 
where ts1.user_id = ts2.user_id 
and ts2.encounter_start 
between ts1.encounter_stop 
and (ts1.encounter_stop + interval '30 days')::date 
)::integer  
) subsequent_encounter_within_30_days 
from test_set ts1
order by user_id, encounter_start;  

差异:上述(和演示)与您的预期结果不一致:
B | 2-2-2000 | 2-7-2000| 1
子ent_encounter(最后一列)应该是0。这个条目开始并结束于2000年2月,另一个B条目开始于2001年5月。请解释这些是如何在30天内(除了一个简单的打字错误)。

注意:不要使用用户作为列名。它既是Postgres保留字,也是SQL标准保留字。有时候你可以用双引号。如果你双引号,你必须总是这样做。最大的问题是它有一个预定义的含义(运行select user;),如果你忘记双引号是没有必要产生错误或异常;更糟糕的是——错误的结果

相关内容

  • 没有找到相关文章

最新更新