Teradata SQL:比较组内的值

时间:2015-07-27 09:44:09

标签: sql teradata

我最近遇到了一个问题,似乎无法使用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由给定条件触发。我想出了一个解决方案,需要自我加入到桌面,但我希望以更好的方式做到这一点并同时学习一些新技术。任何帮助或提示将不胜感激。

1 个答案:

答案 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;