2014-02-06 148 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