2014-02-06 73 views
0

是否有可能“嵌套” Teradata的合格声明?在Teradata嵌套合格声明

我有一些数据,看起来像这样:

event_id = 1: 

user_id  action_timestamp 
971,134,265 17mar2010 20:16:56 
739,071,748 17mar2010 22:19:59 
919,853,934 18mar2010 15:47:49 
919,853,934 18mar2010 15:55:21 
919,853,934 18mar2010 16:01:20 
919,853,934 18mar2010 16:01:48 
919,853,934 18mar2010 16:04:52 
472,665,603 20mar2010 18:23:58 
472,665,603 20mar2010 18:24:07 
472,665,603 20mar2010 18:24:26 
    .... 
event_id = 2:  
971,134,265 17mar2069 20:16:56 
739,071,748 17mar2069 22:19:59 
919,853,934 18mar2069 15:47:49 
919,853,934 18mar2069 15:55:21 
919,853,934 18mar2069 16:01:20 
919,853,934 18mar2069 16:01:48 
919,853,934 18mar2069 16:04:52 
472,665,603 20mar2069 18:23:58 
472,665,603 20mar2069 18:24:07 
472,665,603 20mar2069 18:24:26 

对于用户919853934,我想抓住“18mar2010 16时04分52秒”行动(最后一个活动的第一集群中)。

我想这一点,不抢权日期:

SELECT action_timestamp 
     ,user_id 
     ,event_id 
FROM table 
WHERE ... 
QUALIFY (
    MAX(action_timestampt) OVER (PARTITION BY user_id, event_id) = action_timestamp 
    AND MIN(action_timestamp) OVER (PARTITION BY user_id) = action_timestamp 
) 

这实际上是有道理的,因为MAX和MIN适用于整个数据,而不是按顺序。

我还尝试了2个单独的限定语句,以使MIN()部分适用于MAX()部分创建的数据的子集,但是那些错误。

回答

1

这似乎完成我想要的东西:

SELECT * 
FROM 
(SELECT * 
    FROM table 
    WHERE ... 
    QUALIFY (MAX(action_date) OVER (PARTITION BY user_id, event_id) = action_date) 
) AS a 
QUALIFY (
    MIN(a.action_date) OVER (PARTITION BY a.user_id) = a.action_date 
) 
0

这个查询如何失败?

当然,您可以在QUALIFY中使用多个条件,您的查询在语法上是正确的。

但它的逻辑不会为给定的数据返回一行:-)

你可能需要重写一遍,也许

QUALIFY (
    RANK() OVER (PARTITION BY user_id ORDER BY event_id) = 1 
) 
+0

这将运行,但不会抢权行。 –

0

只需按claue添加顺序,并检查它是否会获取第一个集群的最后一个值。

QUALIFY (
    RANK() OVER (PARTITION BY user_id ORDER BY event_id order by action_timestamp desc) = 1 
) 

注:将工作FF您有兴趣只得到这个值18mar2010 16:04:52used_id =1