Teradata SQL:比较组内的值
Teradata SQL: Compare values inside group
我最近 运行 遇到了一个问题,似乎无法使用 SQL(或其他方式)找到很好的解决方案。我有一个 table 如下所示
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
给出),如果使用 start_date
小于等于end_date
。对于上面的示例,我们将得到结果 table as
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
相同,其中事件 B
由给定条件触发。我想出了一个解决方案,需要自我加入 table 但我希望以更好的方式做到这一点,同时学习一些新技术。任何帮助或提示将不胜感激。
我认为您可以使用 window 函数做您想做的事。如果我理解逻辑:
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;
我最近 运行 遇到了一个问题,似乎无法使用 SQL(或其他方式)找到很好的解决方案。我有一个 table 如下所示
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
给出),如果使用 start_date
小于等于end_date
。对于上面的示例,我们将得到结果 table as
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
相同,其中事件 B
由给定条件触发。我想出了一个解决方案,需要自我加入 table 但我希望以更好的方式做到这一点,同时学习一些新技术。任何帮助或提示将不胜感激。
我认为您可以使用 window 函数做您想做的事。如果我理解逻辑:
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;