我最近遇到了一个问题,似乎无法使用SQL(或其他方式)找到一个很好的解决方案。我有一张如下表
uid | event | start_date | end_date
1 A 23/07/2014 NULL
1 B 25/07/2014 NULL
1 C 26/08/2014 NULL
1 A NULL 25/07/2014
2 A 23/07/2014 NULL
2 C 19/09/2014 NULL
2 B 13/10/2014 NULL
2 A NULL 25/10/2014
2 B 12/09/2014 NULL
对于每个用户(由唯一用户ID uid
提供),如果使用{{1触发了相同的事件,我希望有另一列的值为1
小于或等于start_date
。对于上面的示例,我们将结果表格作为
end_date
因为对于用户uid | event | start_date | end_date | triggered
1 A 23/07/2014 NULL 1
1 B 25/07/2014 NULL 0
1 C 26/08/2014 NULL 0
1 A NULL 25/07/2014 1
2 A 28/11/2014 NULL 0
2 C 19/09/2014 NULL 0
2 B 13/10/2014 NULL 1
2 A NULL 25/10/2014 0
2 B NULL 15/11/2014 1
,事件1
具有A
,因此该事件的相应start_date <= end_date
值将为triggered
。对于用户1
也是如此,其中事件2
由给定条件触发。我想出了一个解决方案,需要自我加入到桌面,但我希望以更好的方式做到这一点并同时学习一些新技术。任何帮助或提示将不胜感激。
答案 0 :(得分:2)
我认为你可以用窗口功能做你想做的事。如果我理解逻辑:
select t.*,
(case when min(start_date) over (partition by uid, event) <
max(end_date) over (partition by uid, event)
then 1 else 0
end) as triggered
from table t;